summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Shalamov <alexander.shalamov@mapbox.com>2020-02-27 11:46:17 +0200
committerAlexander Shalamov <alexander.shalamov@mapbox.com>2020-03-05 17:43:37 +0200
commit81e116d41a4ea1e3ed0d5e91e06541c3e8855a09 (patch)
tree79cdee7e5a4ffda6fafcb9f4fce39b5b87682385
parentc5155dcf334a5c5125c065e4447cb8b30989e5e5 (diff)
downloadqtlocation-mapboxgl-81e116d41a4ea1e3ed0d5e91e06541c3e8855a09.tar.gz
[core] Use weak annotation manager
Map and renderer / orchestrator should be able to run on a separate threads, however, legacy AnnotationManager is shared between Map and Renderer, therefore is not a thread safe. Until AnnotationManager is deprecated and removed from a code-base, use it only via weak pointers.
-rw-r--r--src/mbgl/annotation/annotation_manager.hpp5
-rw-r--r--src/mbgl/annotation/annotation_tile.cpp10
-rw-r--r--src/mbgl/annotation/annotation_tile.hpp2
-rw-r--r--src/mbgl/map/map_impl.cpp38
-rw-r--r--src/mbgl/renderer/render_orchestrator.cpp5
-rw-r--r--src/mbgl/renderer/tile_parameters.hpp4
-rw-r--r--src/mbgl/renderer/update_parameters.hpp4
-rw-r--r--test/style/source.test.cpp2
-rw-r--r--test/tile/custom_geometry_tile.test.cpp20
-rw-r--r--test/tile/geojson_tile.test.cpp20
-rw-r--r--test/tile/raster_dem_tile.test.cpp20
-rw-r--r--test/tile/raster_tile.test.cpp20
-rw-r--r--test/tile/tile_cache.test.cpp2
-rw-r--r--test/tile/vector_tile.test.cpp20
14 files changed, 89 insertions, 83 deletions
diff --git a/src/mbgl/annotation/annotation_manager.hpp b/src/mbgl/annotation/annotation_manager.hpp
index 6c794d7f84..a9389d8ca9 100644
--- a/src/mbgl/annotation/annotation_manager.hpp
+++ b/src/mbgl/annotation/annotation_manager.hpp
@@ -11,6 +11,8 @@
#include <unordered_set>
#include <unordered_map>
+#include <mapbox/weak.hpp>
+
namespace mbgl {
class LatLngBounds;
@@ -48,6 +50,8 @@ public:
static const std::string PointLayerID;
static const std::string ShapeLayerID;
+ mapbox::base::WeakPtr<AnnotationManager> makeWeakPtr() { return weakFactory.makeWeakPtr(); }
+
private:
void add(const AnnotationID&, const SymbolAnnotation&);
void add(const AnnotationID&, const LineAnnotation&);
@@ -84,6 +88,7 @@ private:
ImageMap images;
std::unordered_set<AnnotationTile*> tiles;
+ mapbox::base::WeakPtrFactory<AnnotationManager> weakFactory{this};
};
} // namespace mbgl
diff --git a/src/mbgl/annotation/annotation_tile.cpp b/src/mbgl/annotation/annotation_tile.cpp
index a410adc95e..69c9f07655 100644
--- a/src/mbgl/annotation/annotation_tile.cpp
+++ b/src/mbgl/annotation/annotation_tile.cpp
@@ -11,11 +11,17 @@ AnnotationTile::AnnotationTile(const OverscaledTileID& overscaledTileID,
const TileParameters& parameters)
: GeometryTile(overscaledTileID, AnnotationManager::SourceID, parameters),
annotationManager(parameters.annotationManager) {
- annotationManager.addTile(*this);
+ auto guard = annotationManager.lock();
+ if (annotationManager) {
+ annotationManager->addTile(*this);
+ }
}
AnnotationTile::~AnnotationTile() {
- annotationManager.removeTile(*this);
+ auto guard = annotationManager.lock();
+ if (annotationManager) {
+ annotationManager->removeTile(*this);
+ }
}
class AnnotationTileFeatureData {
diff --git a/src/mbgl/annotation/annotation_tile.hpp b/src/mbgl/annotation/annotation_tile.hpp
index 741b598a8c..da5fc28cb6 100644
--- a/src/mbgl/annotation/annotation_tile.hpp
+++ b/src/mbgl/annotation/annotation_tile.hpp
@@ -15,7 +15,7 @@ public:
~AnnotationTile() override;
private:
- AnnotationManager& annotationManager;
+ mapbox::base::WeakPtr<AnnotationManager> annotationManager;
};
class AnnotationTileFeatureData;
diff --git a/src/mbgl/map/map_impl.cpp b/src/mbgl/map/map_impl.cpp
index af18720916..0edc715134 100644
--- a/src/mbgl/map/map_impl.cpp
+++ b/src/mbgl/map/map_impl.cpp
@@ -48,26 +48,24 @@ void Map::Impl::onUpdate() {
transform.updateTransitions(timePoint);
- UpdateParameters params = {
- style->impl->isLoaded(),
- mode,
- pixelRatio,
- debugOptions,
- timePoint,
- transform.getState(),
- style->impl->getGlyphURL(),
- style->impl->spriteLoaded,
- style->impl->getTransitionOptions(),
- style->impl->getLight()->impl,
- style->impl->getImageImpls(),
- style->impl->getSourceImpls(),
- style->impl->getLayerImpls(),
- annotationManager,
- fileSource,
- prefetchZoomDelta,
- bool(stillImageRequest),
- crossSourceCollisions
- };
+ UpdateParameters params = {style->impl->isLoaded(),
+ mode,
+ pixelRatio,
+ debugOptions,
+ timePoint,
+ transform.getState(),
+ style->impl->getGlyphURL(),
+ style->impl->spriteLoaded,
+ style->impl->getTransitionOptions(),
+ style->impl->getLight()->impl,
+ style->impl->getImageImpls(),
+ style->impl->getSourceImpls(),
+ style->impl->getLayerImpls(),
+ annotationManager.makeWeakPtr(),
+ fileSource,
+ prefetchZoomDelta,
+ bool(stillImageRequest),
+ crossSourceCollisions};
rendererFrontend.update(std::make_shared<UpdateParameters>(std::move(params)));
}
diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp
index c771bd100b..f00f9ee9be 100644
--- a/src/mbgl/renderer/render_orchestrator.cpp
+++ b/src/mbgl/renderer/render_orchestrator.cpp
@@ -144,7 +144,10 @@ std::unique_ptr<RenderTree> RenderOrchestrator::createRenderTree(
}
if (LayerManager::annotationsEnabled) {
- updateParameters->annotationManager.updateData();
+ auto guard = updateParameters->annotationManager.lock();
+ if (updateParameters->annotationManager) {
+ updateParameters->annotationManager->updateData();
+ }
}
const bool zoomChanged =
diff --git a/src/mbgl/renderer/tile_parameters.hpp b/src/mbgl/renderer/tile_parameters.hpp
index 6a2deee35c..147e19f146 100644
--- a/src/mbgl/renderer/tile_parameters.hpp
+++ b/src/mbgl/renderer/tile_parameters.hpp
@@ -4,6 +4,8 @@
#include <memory>
+#include <mapbox/weak.hpp>
+
namespace mbgl {
class TransformState;
@@ -19,7 +21,7 @@ public:
const TransformState& transformState;
std::shared_ptr<FileSource> fileSource;
const MapMode mode;
- AnnotationManager& annotationManager;
+ mapbox::base::WeakPtr<AnnotationManager> annotationManager;
ImageManager& imageManager;
GlyphManager& glyphManager;
const uint8_t prefetchZoomDelta;
diff --git a/src/mbgl/renderer/update_parameters.hpp b/src/mbgl/renderer/update_parameters.hpp
index b7aee9b572..8dd256329a 100644
--- a/src/mbgl/renderer/update_parameters.hpp
+++ b/src/mbgl/renderer/update_parameters.hpp
@@ -11,6 +11,8 @@
#include <vector>
+#include <mapbox/weak.hpp>
+
namespace mbgl {
class AnnotationManager;
@@ -33,7 +35,7 @@ public:
const Immutable<std::vector<Immutable<style::Source::Impl>>> sources;
const Immutable<std::vector<Immutable<style::Layer::Impl>>> layers;
- AnnotationManager& annotationManager;
+ mapbox::base::WeakPtr<AnnotationManager> annotationManager;
std::shared_ptr<FileSource> fileSource;
const uint8_t prefetchZoomDelta;
diff --git a/test/style/source.test.cpp b/test/style/source.test.cpp
index dbc67681e9..37f87fb982 100644
--- a/test/style/source.test.cpp
+++ b/test/style/source.test.cpp
@@ -69,7 +69,7 @@ public:
transformState,
fileSource,
mapMode,
- annotationManager,
+ annotationManager.makeWeakPtr(),
imageManager,
glyphManager,
0};
diff --git a/test/tile/custom_geometry_tile.test.cpp b/test/tile/custom_geometry_tile.test.cpp
index 6e8a7e6981..28f2b7ef5a 100644
--- a/test/tile/custom_geometry_tile.test.cpp
+++ b/test/tile/custom_geometry_tile.test.cpp
@@ -30,17 +30,15 @@ public:
ImageManager imageManager;
GlyphManager glyphManager;
- TileParameters tileParameters {
- 1.0,
- MapDebugOptions(),
- transformState,
- fileSource,
- MapMode::Continuous,
- annotationManager,
- imageManager,
- glyphManager,
- 0
- };
+ TileParameters tileParameters{1.0,
+ MapDebugOptions(),
+ transformState,
+ fileSource,
+ MapMode::Continuous,
+ annotationManager.makeWeakPtr(),
+ imageManager,
+ glyphManager,
+ 0};
};
TEST(CustomGeometryTile, InvokeFetchTile) {
diff --git a/test/tile/geojson_tile.test.cpp b/test/tile/geojson_tile.test.cpp
index 25fd268dc8..bffd99999e 100644
--- a/test/tile/geojson_tile.test.cpp
+++ b/test/tile/geojson_tile.test.cpp
@@ -31,17 +31,15 @@ public:
GlyphManager glyphManager;
Tileset tileset { { "https://example.com" }, { 0, 22 }, "none" };
- TileParameters tileParameters {
- 1.0,
- MapDebugOptions(),
- transformState,
- fileSource,
- MapMode::Continuous,
- annotationManager,
- imageManager,
- glyphManager,
- 0
- };
+ TileParameters tileParameters{1.0,
+ MapDebugOptions(),
+ transformState,
+ fileSource,
+ MapMode::Continuous,
+ annotationManager.makeWeakPtr(),
+ imageManager,
+ glyphManager,
+ 0};
};
namespace {
diff --git a/test/tile/raster_dem_tile.test.cpp b/test/tile/raster_dem_tile.test.cpp
index f5f7610096..3c12e7b4be 100644
--- a/test/tile/raster_dem_tile.test.cpp
+++ b/test/tile/raster_dem_tile.test.cpp
@@ -25,17 +25,15 @@ public:
GlyphManager glyphManager;
Tileset tileset { { "https://example.com" }, { 0, 22 }, "none" };
- TileParameters tileParameters {
- 1.0,
- MapDebugOptions(),
- transformState,
- fileSource,
- MapMode::Continuous,
- annotationManager,
- imageManager,
- glyphManager,
- 0
- };
+ TileParameters tileParameters{1.0,
+ MapDebugOptions(),
+ transformState,
+ fileSource,
+ MapMode::Continuous,
+ annotationManager.makeWeakPtr(),
+ imageManager,
+ glyphManager,
+ 0};
};
TEST(RasterDEMTile, setError) {
diff --git a/test/tile/raster_tile.test.cpp b/test/tile/raster_tile.test.cpp
index a5a2875f2e..db5087dc3e 100644
--- a/test/tile/raster_tile.test.cpp
+++ b/test/tile/raster_tile.test.cpp
@@ -25,17 +25,15 @@ public:
GlyphManager glyphManager;
Tileset tileset { { "https://example.com" }, { 0, 22 }, "none" };
- TileParameters tileParameters {
- 1.0,
- MapDebugOptions(),
- transformState,
- fileSource,
- MapMode::Continuous,
- annotationManager,
- imageManager,
- glyphManager,
- 0
- };
+ TileParameters tileParameters{1.0,
+ MapDebugOptions(),
+ transformState,
+ fileSource,
+ MapMode::Continuous,
+ annotationManager.makeWeakPtr(),
+ imageManager,
+ glyphManager,
+ 0};
};
TEST(RasterTile, setError) {
diff --git a/test/tile/tile_cache.test.cpp b/test/tile/tile_cache.test.cpp
index 43b409ae87..64444f91cf 100644
--- a/test/tile/tile_cache.test.cpp
+++ b/test/tile/tile_cache.test.cpp
@@ -39,7 +39,7 @@ public:
transformState,
fileSource,
MapMode::Continuous,
- annotationManager,
+ annotationManager.makeWeakPtr(),
imageManager,
glyphManager,
0};
diff --git a/test/tile/vector_tile.test.cpp b/test/tile/vector_tile.test.cpp
index b89a572f7f..b28661d938 100644
--- a/test/tile/vector_tile.test.cpp
+++ b/test/tile/vector_tile.test.cpp
@@ -31,17 +31,15 @@ public:
GlyphManager glyphManager;
Tileset tileset { { "https://example.com" }, { 0, 22 }, "none" };
- TileParameters tileParameters {
- 1.0,
- MapDebugOptions(),
- transformState,
- fileSource,
- MapMode::Continuous,
- annotationManager,
- imageManager,
- glyphManager,
- 0
- };
+ TileParameters tileParameters{1.0,
+ MapDebugOptions(),
+ transformState,
+ fileSource,
+ MapMode::Continuous,
+ annotationManager.makeWeakPtr(),
+ imageManager,
+ glyphManager,
+ 0};
};
TEST(VectorTile, setError) {