summaryrefslogtreecommitdiff
path: root/src/mbgl/tile
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-05-13 16:37:40 +0300
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-05-14 11:29:24 +0300
commit5b6a262e1544fc9f649b53ef15ae19b9057356f1 (patch)
tree004cf1678190a8a75bb48e002da39575793f3023 /src/mbgl/tile
parent7e77aff8dfc2434846614f919cd4f8db1a2ca2f0 (diff)
downloadqtlocation-mapboxgl-5b6a262e1544fc9f649b53ef15ae19b9057356f1.tar.gz
[core] GeometryTile and TileLoader keep strong reference to FileSource
Thus we fix a potential bug: if `Renderer` outlives the `Map` it will hold a stale reference to the `FileSource` instance.
Diffstat (limited to 'src/mbgl/tile')
-rw-r--r--src/mbgl/tile/geometry_tile.cpp2
-rw-r--r--src/mbgl/tile/geometry_tile.hpp2
-rw-r--r--src/mbgl/tile/tile_loader.hpp7
-rw-r--r--src/mbgl/tile/tile_loader_impl.hpp6
4 files changed, 9 insertions, 8 deletions
diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp
index 3057712176..5469fa0e6f 100644
--- a/src/mbgl/tile/geometry_tile.cpp
+++ b/src/mbgl/tile/geometry_tile.cpp
@@ -157,7 +157,7 @@ void GeometryTile::onGlyphsAvailable(GlyphMap glyphs) {
}
void GeometryTile::getGlyphs(GlyphDependencies glyphDependencies) {
- glyphManager.getGlyphs(*this, std::move(glyphDependencies), fileSource);
+ glyphManager.getGlyphs(*this, std::move(glyphDependencies), *fileSource);
}
void GeometryTile::onImagesAvailable(ImageMap images, ImageMap patterns, ImageVersionMap versionMap, uint64_t imageCorrelationID) {
diff --git a/src/mbgl/tile/geometry_tile.hpp b/src/mbgl/tile/geometry_tile.hpp
index fadc0aab41..5c2e8245ee 100644
--- a/src/mbgl/tile/geometry_tile.hpp
+++ b/src/mbgl/tile/geometry_tile.hpp
@@ -108,7 +108,7 @@ private:
std::shared_ptr<Mailbox> mailbox;
Actor<GeometryTileWorker> worker;
- FileSource& fileSource;
+ std::shared_ptr<FileSource> fileSource;
GlyphManager& glyphManager;
ImageManager& imageManager;
diff --git a/src/mbgl/tile/tile_loader.hpp b/src/mbgl/tile/tile_loader.hpp
index 92ca74330f..65f4ceb118 100644
--- a/src/mbgl/tile/tile_loader.hpp
+++ b/src/mbgl/tile/tile_loader.hpp
@@ -1,6 +1,5 @@
#pragma once
-#include <mbgl/util/noncopyable.hpp>
#include <mbgl/storage/resource.hpp>
#include <mbgl/tile/tile.hpp>
@@ -13,8 +12,10 @@ class Tileset;
class TileParameters;
template <typename T>
-class TileLoader : private util::noncopyable {
+class TileLoader {
public:
+ TileLoader(const TileLoader&) = delete;
+ TileLoader& operator=(const TileLoader&) = delete;
TileLoader(T&,
const OverscaledTileID&,
const TileParameters&,
@@ -50,7 +51,7 @@ private:
T& tile;
TileNecessity necessity;
Resource resource;
- FileSource& fileSource;
+ std::shared_ptr<FileSource> fileSource;
std::unique_ptr<AsyncRequest> request;
};
diff --git a/src/mbgl/tile/tile_loader_impl.hpp b/src/mbgl/tile/tile_loader_impl.hpp
index 5835858d1a..bbe579ed00 100644
--- a/src/mbgl/tile/tile_loader_impl.hpp
+++ b/src/mbgl/tile/tile_loader_impl.hpp
@@ -27,7 +27,7 @@ TileLoader<T>::TileLoader(T& tile_,
Resource::LoadingMethod::CacheOnly)),
fileSource(parameters.fileSource) {
assert(!request);
- if (fileSource.supportsCacheOnlyRequests()) {
+ if (fileSource->supportsCacheOnlyRequests()) {
// When supported, the first request is always optional, even if the TileLoader
// is marked as required. That way, we can let the first optional request continue
// to load when the TileLoader is later changed from required to optional. If we
@@ -52,7 +52,7 @@ void TileLoader<T>::loadFromCache() {
assert(!request);
resource.loadingMethod = Resource::LoadingMethod::CacheOnly;
- request = fileSource.request(resource, [this](Response res) {
+ request = fileSource->request(resource, [this](Response res) {
request.reset();
tile.setTriedCache();
@@ -118,7 +118,7 @@ void TileLoader<T>::loadFromNetwork() {
// Instead of using Resource::LoadingMethod::All, we're first doing a CacheOnly, and then a
// NetworkOnly request.
resource.loadingMethod = Resource::LoadingMethod::NetworkOnly;
- request = fileSource.request(resource, [this](Response res) { loadedData(res); });
+ request = fileSource->request(resource, [this](Response res) { loadedData(res); });
}
} // namespace mbgl