diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-05-13 16:37:40 +0300 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-05-14 11:29:24 +0300 |
commit | 5b6a262e1544fc9f649b53ef15ae19b9057356f1 (patch) | |
tree | 004cf1678190a8a75bb48e002da39575793f3023 /src | |
parent | 7e77aff8dfc2434846614f919cd4f8db1a2ca2f0 (diff) | |
download | qtlocation-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')
-rw-r--r-- | src/mbgl/map/map_impl.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/tile_parameters.hpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/update_parameters.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/tile/tile_loader.hpp | 7 | ||||
-rw-r--r-- | src/mbgl/tile/tile_loader_impl.hpp | 6 |
7 files changed, 14 insertions, 11 deletions
diff --git a/src/mbgl/map/map_impl.cpp b/src/mbgl/map/map_impl.cpp index fa15461ff2..d7c7c00d0a 100644 --- a/src/mbgl/map/map_impl.cpp +++ b/src/mbgl/map/map_impl.cpp @@ -63,7 +63,7 @@ void Map::Impl::onUpdate() { style->impl->getSourceImpls(), style->impl->getLayerImpls(), annotationManager, - *fileSource, + fileSource, prefetchZoomDelta, bool(stillImageRequest), crossSourceCollisions diff --git a/src/mbgl/renderer/tile_parameters.hpp b/src/mbgl/renderer/tile_parameters.hpp index cbe8dfb3ba..6a2deee35c 100644 --- a/src/mbgl/renderer/tile_parameters.hpp +++ b/src/mbgl/renderer/tile_parameters.hpp @@ -2,6 +2,8 @@ #include <mbgl/map/mode.hpp> +#include <memory> + namespace mbgl { class TransformState; @@ -15,7 +17,7 @@ public: const float pixelRatio; const MapDebugOptions debugOptions; const TransformState& transformState; - FileSource& fileSource; + std::shared_ptr<FileSource> fileSource; const MapMode mode; AnnotationManager& annotationManager; ImageManager& imageManager; diff --git a/src/mbgl/renderer/update_parameters.hpp b/src/mbgl/renderer/update_parameters.hpp index da6ed0801e..b7aee9b572 100644 --- a/src/mbgl/renderer/update_parameters.hpp +++ b/src/mbgl/renderer/update_parameters.hpp @@ -34,7 +34,7 @@ public: const Immutable<std::vector<Immutable<style::Layer::Impl>>> layers; AnnotationManager& annotationManager; - FileSource& fileSource; + std::shared_ptr<FileSource> fileSource; const uint8_t prefetchZoomDelta; 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 |