From 1f5fb1db4afae8a8bae02c42870f6f9e5e5f7905 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Tue, 2 Jun 2015 17:06:24 -0400 Subject: [PATCH] fix hangs caused by redoPlacement After parsing a tile, it redoes placement for that tile if the angle has changed since it started parsing. These redo calls were accidentally done from the worker thread. Assigning the new work to `workRequest` caused it to cancel itself. Fix the problem by calling redoPlacement from the map thread. --- src/mbgl/map/live_tile_data.cpp | 1 - src/mbgl/map/source.cpp | 16 +++++++--------- src/mbgl/map/source.hpp | 3 +-- src/mbgl/map/vector_tile_data.cpp | 1 - 4 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/mbgl/map/live_tile_data.cpp b/src/mbgl/map/live_tile_data.cpp index f2b5e0427..1d8c42e1e 100644 --- a/src/mbgl/map/live_tile_data.cpp +++ b/src/mbgl/map/live_tile_data.cpp @@ -55,6 +55,5 @@ void LiveTileData::parse() { if (getState() != State::obsolete) { setState(State::parsed); - redoPlacement(); } } diff --git a/src/mbgl/map/source.cpp b/src/mbgl/map/source.cpp index b6838a471..ae39b84ee 100644 --- a/src/mbgl/map/source.cpp +++ b/src/mbgl/map/source.cpp @@ -290,7 +290,7 @@ TileData::State Source::addTile(MapData& data, } if (!new_tile.data) { - auto callback = std::bind(&Source::tileLoadingCompleteCallback, this, normalized_id); + auto callback = std::bind(&Source::tileLoadingCompleteCallback, this, normalized_id, transformState, data.getCollisionDebug()); // If we don't find working tile data, we're just going to load it. if (info.type == SourceType::Vector) { @@ -513,7 +513,9 @@ bool Source::update(MapData& data, updateTilePtrs(); - redoPlacement(transformState, data.getCollisionDebug()); + for (auto& tilePtr : tilePtrs) { + tilePtr->data->redoPlacement(transformState.getAngle(), data.getCollisionDebug()); + } updated = data.getAnimationTime(); @@ -536,12 +538,6 @@ void Source::updateTilePtrs() { } } -void Source::redoPlacement(const TransformState& transformState, bool collisionDebug) { - for (auto& tilePtr : tilePtrs) { - tilePtr->data->redoPlacement(transformState.getAngle(), collisionDebug); - } -} - void Source::setCacheSize(size_t size) { cache.setSize(size); } @@ -554,7 +550,7 @@ void Source::setObserver(Observer* observer) { observer_ = observer; } -void Source::tileLoadingCompleteCallback(const TileID& normalized_id) { +void Source::tileLoadingCompleteCallback(const TileID& normalized_id, const TransformState& transformState, bool collisionDebug) { auto it = tile_data.find(normalized_id); if (it == tile_data.end()) { return; @@ -571,6 +567,8 @@ void Source::tileLoadingCompleteCallback(const TileID& normalized_id) { } emitTileLoaded(true); + data->redoPlacement(transformState.getAngle(), collisionDebug); + } void Source::emitSourceLoaded() { diff --git a/src/mbgl/map/source.hpp b/src/mbgl/map/source.hpp index bf49bd69e..be869559b 100644 --- a/src/mbgl/map/source.hpp +++ b/src/mbgl/map/source.hpp @@ -104,8 +104,7 @@ public: bool enabled; private: - void redoPlacement(const TransformState& transformState, bool collisionDebug); - void tileLoadingCompleteCallback(const TileID& normalized_id); + void tileLoadingCompleteCallback(const TileID& normalized_id, const TransformState& transformState, bool collisionDebug); void emitSourceLoaded(); void emitSourceLoadingFailed(const std::string& message); diff --git a/src/mbgl/map/vector_tile_data.cpp b/src/mbgl/map/vector_tile_data.cpp index 799eeb80c..d431a200e 100644 --- a/src/mbgl/map/vector_tile_data.cpp +++ b/src/mbgl/map/vector_tile_data.cpp @@ -64,7 +64,6 @@ void VectorTileData::parse() { setState(State::partial); } else { setState(State::parsed); - redoPlacement(); } } catch (const std::exception& ex) { std::stringstream message;