From 21dc12ee93e890325c61daa0e4183dd1e795f0a9 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 26 Aug 2016 13:11:33 -0700 Subject: [core] Ensure that TileWorker can retain tileData after layout --- src/mbgl/annotation/annotation_tile.cpp | 4 ++++ src/mbgl/annotation/annotation_tile.hpp | 1 + src/mbgl/tile/geojson_tile.cpp | 4 ++++ src/mbgl/tile/geometry_tile.cpp | 2 ++ src/mbgl/tile/geometry_tile_data.hpp | 1 + src/mbgl/tile/tile_worker.cpp | 2 +- src/mbgl/tile/vector_tile.cpp | 4 ++++ 7 files changed, 17 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/mbgl/annotation/annotation_tile.cpp b/src/mbgl/annotation/annotation_tile.cpp index 6b225ce20b..c9ad9b5214 100644 --- a/src/mbgl/annotation/annotation_tile.cpp +++ b/src/mbgl/annotation/annotation_tile.cpp @@ -40,6 +40,10 @@ optional AnnotationTileFeature::getValue(const std::string& key) const { AnnotationTileLayer::AnnotationTileLayer(std::string name_) : name(std::move(name_)) {} +std::unique_ptr AnnotationTileData::clone() const { + return std::make_unique(*this); +} + const GeometryTileLayer* AnnotationTileData::getLayer(const std::string& name) const { auto it = layers.find(name); if (it != layers.end()) { diff --git a/src/mbgl/annotation/annotation_tile.hpp b/src/mbgl/annotation/annotation_tile.hpp index 19a731ee7b..d43ec82d38 100644 --- a/src/mbgl/annotation/annotation_tile.hpp +++ b/src/mbgl/annotation/annotation_tile.hpp @@ -56,6 +56,7 @@ private: class AnnotationTileData : public GeometryTileData { public: + std::unique_ptr clone() const override; const GeometryTileLayer* getLayer(const std::string&) const override; std::unordered_map layers; diff --git a/src/mbgl/tile/geojson_tile.cpp b/src/mbgl/tile/geojson_tile.cpp index bba347f39d..5dc099de69 100644 --- a/src/mbgl/tile/geojson_tile.cpp +++ b/src/mbgl/tile/geojson_tile.cpp @@ -55,6 +55,10 @@ public: : features(std::move(features_)) { } + std::unique_ptr clone() const override { + return std::make_unique(*this); + } + const GeometryTileLayer* getLayer(const std::string&) const override { return this; } diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index e4e2085d05..bd2d8f760f 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -66,6 +66,8 @@ void GeometryTile::setData(std::unique_ptr data_) { workRequest.reset(); availableData = DataAvailability::All; buckets.clear(); + featureIndex.reset(); + data.reset(); redoPlacement(); observer->onTileLoaded(*this, true); return; diff --git a/src/mbgl/tile/geometry_tile_data.hpp b/src/mbgl/tile/geometry_tile_data.hpp index 2714b139ed..8a10ec058a 100644 --- a/src/mbgl/tile/geometry_tile_data.hpp +++ b/src/mbgl/tile/geometry_tile_data.hpp @@ -51,6 +51,7 @@ public: class GeometryTileData { public: virtual ~GeometryTileData() = default; + virtual std::unique_ptr clone() const = 0; virtual const GeometryTileLayer* getLayer(const std::string&) const = 0; }; diff --git a/src/mbgl/tile/tile_worker.cpp b/src/mbgl/tile/tile_worker.cpp index 5761ca83b9..0c90456da0 100644 --- a/src/mbgl/tile/tile_worker.cpp +++ b/src/mbgl/tile/tile_worker.cpp @@ -95,7 +95,7 @@ TileParseResult TileWorker::prepareResult(const PlacementConfig& config) { if (result.complete) { featureIndex->setCollisionTile(placeLayers(config)); result.featureIndex = std::move(featureIndex); - result.tileData = std::move(tileData); + result.tileData = tileData->clone(); } return std::move(result); diff --git a/src/mbgl/tile/vector_tile.cpp b/src/mbgl/tile/vector_tile.cpp index c388a60cbb..4a1f60711c 100644 --- a/src/mbgl/tile/vector_tile.cpp +++ b/src/mbgl/tile/vector_tile.cpp @@ -59,6 +59,10 @@ class VectorTileData : public GeometryTileData { public: VectorTileData(std::shared_ptr data); + std::unique_ptr clone() const override { + return std::make_unique(*this); + } + const GeometryTileLayer* getLayer(const std::string&) const override; private: -- cgit v1.2.1