summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2016-05-25 20:28:18 +0200
committerKonstantin Käfer <mail@kkaefer.com>2016-05-25 21:51:25 +0200
commit6f1477f2d4aee46f41215d16dcc0a2755e4ae721 (patch)
treed8109233c1c585799f158833a4506346e13a1327
parentc91e4ee1f4c9e7150090a8c40a49966a2e169c26 (diff)
downloadqtlocation-mapboxgl-6f1477f2d4aee46f41215d16dcc0a2755e4ae721.tar.gz
[core] split TileData::State::obsolete into its own thing
-rw-r--r--src/mbgl/style/style_bucket_parameters.hpp10
-rw-r--r--src/mbgl/tile/raster_tile_data.cpp1
-rw-r--r--src/mbgl/tile/tile_data.cpp1
-rw-r--r--src/mbgl/tile/tile_data.hpp8
-rw-r--r--src/mbgl/tile/tile_worker.cpp12
-rw-r--r--src/mbgl/tile/tile_worker.hpp8
-rw-r--r--src/mbgl/tile/vector_tile_data.cpp8
-rw-r--r--src/mbgl/tile/vector_tile_data.hpp3
8 files changed, 23 insertions, 28 deletions
diff --git a/src/mbgl/style/style_bucket_parameters.hpp b/src/mbgl/style/style_bucket_parameters.hpp
index ab63f8fe55..6234d5c301 100644
--- a/src/mbgl/style/style_bucket_parameters.hpp
+++ b/src/mbgl/style/style_bucket_parameters.hpp
@@ -1,8 +1,8 @@
#pragma once
#include <mbgl/map/mode.hpp>
+#include <mbgl/tile/tile_id.hpp>
#include <mbgl/style/filter.hpp>
-#include <mbgl/tile/tile_data.hpp>
#include <functional>
@@ -21,7 +21,7 @@ class StyleBucketParameters {
public:
StyleBucketParameters(const OverscaledTileID& tileID_,
const GeometryTileLayer& layer_,
- const std::atomic<TileData::State>& state_,
+ const std::atomic<bool>& obsolete_,
uintptr_t tileUID_,
bool& partialParse_,
SpriteStore& spriteStore_,
@@ -31,7 +31,7 @@ public:
const MapMode mode_)
: tileID(tileID_),
layer(layer_),
- state(state_),
+ obsolete(obsolete_),
tileUID(tileUID_),
partialParse(partialParse_),
spriteStore(spriteStore_),
@@ -41,14 +41,14 @@ public:
mode(mode_) {}
bool cancelled() const {
- return state == TileData::State::obsolete;
+ return obsolete;
}
void eachFilteredFeature(const Filter&, std::function<void (const GeometryTileFeature&, std::size_t index, const std::string& layerName)>);
const OverscaledTileID& tileID;
const GeometryTileLayer& layer;
- const std::atomic<TileData::State>& state;
+ const std::atomic<bool>& obsolete;
uintptr_t tileUID;
bool& partialParse;
SpriteStore& spriteStore;
diff --git a/src/mbgl/tile/raster_tile_data.cpp b/src/mbgl/tile/raster_tile_data.cpp
index aab166807f..b70cd1d836 100644
--- a/src/mbgl/tile/raster_tile_data.cpp
+++ b/src/mbgl/tile/raster_tile_data.cpp
@@ -66,7 +66,6 @@ Bucket* RasterTileData::getBucket(StyleLayer const&) {
}
void RasterTileData::cancel() {
- state = State::obsolete;
req = nullptr;
workRequest.reset();
}
diff --git a/src/mbgl/tile/tile_data.cpp b/src/mbgl/tile/tile_data.cpp
index 0e4237fc25..00cd073197 100644
--- a/src/mbgl/tile/tile_data.cpp
+++ b/src/mbgl/tile/tile_data.cpp
@@ -14,7 +14,6 @@ TileData::~TileData() = default;
const char* TileData::StateToString(const State state) {
switch (state) {
case TileData::State::loading : return "loading";
- case TileData::State::obsolete : return "obsolete";
case TileData::State::parsed : return "parsed";
case TileData::State::partial : return "partial";
default: return "<unknown>";
diff --git a/src/mbgl/tile/tile_data.hpp b/src/mbgl/tile/tile_data.hpp
index 8c93f787fb..d6d9f6289f 100644
--- a/src/mbgl/tile/tile_data.hpp
+++ b/src/mbgl/tile/tile_data.hpp
@@ -9,7 +9,6 @@
#include <mbgl/text/placement_config.hpp>
#include <mbgl/tile/geometry_tile.hpp>
-#include <atomic>
#include <string>
#include <memory>
#include <functional>
@@ -36,15 +35,10 @@ public:
// parsed:
// TileData is fully parsed and its contents won't change from this point. This
// is the only state which is safe to cache this object.
- //
- // obsolete:
- // The TileData can go to obsolete from any state, due to parsing or loading error,
- // request cancellation or because the tile is no longer in use.
enum class State {
loading,
partial,
parsed,
- obsolete
};
static const char* StateToString(State);
@@ -92,7 +86,7 @@ public:
std::unique_ptr<DebugBucket> debugBucket;
protected:
- std::atomic<State> state;
+ State state;
};
} // namespace mbgl
diff --git a/src/mbgl/tile/tile_worker.cpp b/src/mbgl/tile/tile_worker.cpp
index 0a9ab35779..fdebe91229 100644
--- a/src/mbgl/tile/tile_worker.cpp
+++ b/src/mbgl/tile/tile_worker.cpp
@@ -22,14 +22,14 @@ TileWorker::TileWorker(const OverscaledTileID& id_,
SpriteStore& spriteStore_,
GlyphAtlas& glyphAtlas_,
GlyphStore& glyphStore_,
- const std::atomic<TileData::State>& state_,
+ const std::atomic<bool>& obsolete_,
const MapMode mode_)
: id(id_),
sourceID(std::move(sourceID_)),
spriteStore(spriteStore_),
glyphAtlas(glyphAtlas_),
glyphStore(glyphStore_),
- state(state_),
+ obsolete(obsolete_),
mode(mode_) {
}
@@ -92,9 +92,9 @@ TileParseResult TileWorker::parsePendingLayers(const PlacementConfig config) {
}
TileParseResult TileWorker::prepareResult(const PlacementConfig& config) {
- result.state = pending.empty() ? TileData::State::parsed : TileData::State::partial;
+ result.complete = pending.empty();
- if (result.state == TileData::State::parsed) {
+ if (result.complete) {
featureIndex->setCollisionTile(placeLayers(config));
result.featureIndex = std::move(featureIndex);
result.geometryTile = std::move(geometryTile);
@@ -131,7 +131,7 @@ std::unique_ptr<CollisionTile> TileWorker::redoPlacement(
void TileWorker::parseLayer(const StyleLayer* layer) {
// Cancel early when parsing.
- if (state == TileData::State::obsolete)
+ if (obsolete)
return;
// Background and custom layers are special cases.
@@ -158,7 +158,7 @@ void TileWorker::parseLayer(const StyleLayer* layer) {
StyleBucketParameters parameters(id,
*geometryLayer,
- state,
+ obsolete,
reinterpret_cast<uintptr_t>(this),
partialParse,
spriteStore,
diff --git a/src/mbgl/tile/tile_worker.hpp b/src/mbgl/tile/tile_worker.hpp
index 8183b9d554..6a60a17b07 100644
--- a/src/mbgl/tile/tile_worker.hpp
+++ b/src/mbgl/tile/tile_worker.hpp
@@ -1,7 +1,7 @@
#pragma once
#include <mbgl/map/mode.hpp>
-#include <mbgl/tile/tile_data.hpp>
+#include <mbgl/tile/tile_id.hpp>
#include <mbgl/util/noncopyable.hpp>
#include <mbgl/util/variant.hpp>
#include <mbgl/util/ptr.hpp>
@@ -29,7 +29,7 @@ class SymbolLayer;
// thread. This class is movable-only because the vector contains movable-only value elements.
class TileParseResultData {
public:
- TileData::State state;
+ bool complete = false;
std::unordered_map<std::string, std::unique_ptr<Bucket>> buckets;
std::unique_ptr<FeatureIndex> featureIndex;
std::unique_ptr<const GeometryTile> geometryTile;
@@ -46,7 +46,7 @@ public:
SpriteStore&,
GlyphAtlas&,
GlyphStore&,
- const std::atomic<TileData::State>&,
+ const std::atomic<bool>&,
const MapMode);
~TileWorker();
@@ -71,7 +71,7 @@ private:
SpriteStore& spriteStore;
GlyphAtlas& glyphAtlas;
GlyphStore& glyphStore;
- const std::atomic<TileData::State>& state;
+ const std::atomic<bool>& obsolete;
const MapMode mode;
bool partialParse = false;
diff --git a/src/mbgl/tile/vector_tile_data.cpp b/src/mbgl/tile/vector_tile_data.cpp
index afca67e78e..c4df292d9f 100644
--- a/src/mbgl/tile/vector_tile_data.cpp
+++ b/src/mbgl/tile/vector_tile_data.cpp
@@ -25,7 +25,7 @@ VectorTileData::VectorTileData(const OverscaledTileID& id_,
*style_.spriteStore,
*style_.glyphAtlas,
*style_.glyphStore,
- state,
+ obsolete,
mode_),
monitor(std::move(monitor_))
{
@@ -66,7 +66,7 @@ VectorTileData::VectorTileData(const OverscaledTileID& id_,
std::exception_ptr error;
if (result.is<TileParseResultData>()) {
auto& resultBuckets = result.get<TileParseResultData>();
- state = resultBuckets.state;
+ state = resultBuckets.complete ? State::parsed : State::partial;
// Persist the configuration we just placed so that we can later check whether we need to
// place again in case the configuration has changed.
@@ -109,7 +109,7 @@ bool VectorTileData::parsePending(std::function<void(std::exception_ptr)> callba
std::exception_ptr error;
if (result.is<TileParseResultData>()) {
auto& resultBuckets = result.get<TileParseResultData>();
- state = resultBuckets.state;
+ state = resultBuckets.complete ? State::parsed : State::partial;
// Move over all buckets we received in this parse request, potentially overwriting
// existing buckets in case we got a refresh parse.
@@ -205,7 +205,7 @@ void VectorTileData::queryRenderedFeatures(
}
void VectorTileData::cancel() {
- state = State::obsolete;
+ obsolete = true;
tileRequest.reset();
workRequest.reset();
}
diff --git a/src/mbgl/tile/vector_tile_data.hpp b/src/mbgl/tile/vector_tile_data.hpp
index b38fe3828b..2545df801b 100644
--- a/src/mbgl/tile/vector_tile_data.hpp
+++ b/src/mbgl/tile/vector_tile_data.hpp
@@ -64,6 +64,9 @@ private:
// Stores the placement configuration of how the text should be placed. This isn't necessarily
// the one that is being displayed.
PlacementConfig targetConfig;
+
+ // Used to signal the worker that it should abandon parsing this tile as soon as possible.
+ std::atomic<bool> obsolete { false };
};
} // namespace mbgl