summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago Marcos P. Santos <thiago@mapbox.com>2015-05-29 15:30:50 +0300
committerThiago Marcos P. Santos <thiago@mapbox.com>2015-06-04 14:44:34 +0300
commitb09df7acb5139e50b3de7bfcb7e92909ba9c3a56 (patch)
tree1571e671b6c9f884a9891a20ba792382db001ae3
parent29b8b44b7767312095e9489a97ba9eea3f1797af (diff)
downloadqtlocation-mapboxgl-b09df7acb5139e50b3de7bfcb7e92909ba9c3a56.tar.gz
Cleanup the MapContext before the util::Thread destructor
The util::Thread will call the stop() method of the MapContext's RunLoop which will wait for the pending tasks tied to it to complete. If we have a request that is timeout'ing, this could mean a really long wait. Instead, we now send a cleanup message that will reset all the attributes first (canceling the pending requests) so the the MapContext gets destructed quickly.
-rw-r--r--src/mbgl/map/map.cpp1
-rw-r--r--src/mbgl/map/map_context.cpp5
-rw-r--r--src/mbgl/map/map_context.hpp2
-rw-r--r--test/miscellaneous/map_context.cpp1
4 files changed, 9 insertions, 0 deletions
diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp
index 0479189300..47c9472d59 100644
--- a/src/mbgl/map/map.cpp
+++ b/src/mbgl/map/map.cpp
@@ -17,6 +17,7 @@ Map::Map(View& view, FileSource& fileSource, MapMode mode)
Map::~Map() {
resume();
+ context->invoke(&MapContext::cleanup);
}
void Map::pause() {
diff --git a/src/mbgl/map/map_context.cpp b/src/mbgl/map/map_context.cpp
index 47a6b3e4bb..c349bdd155 100644
--- a/src/mbgl/map/map_context.cpp
+++ b/src/mbgl/map/map_context.cpp
@@ -36,6 +36,11 @@ MapContext::MapContext(uv_loop_t* loop, View& view_, FileSource& fileSource, Map
}
MapContext::~MapContext() {
+ // Make sure we call cleanup() before deleting this object.
+ assert(!style);
+}
+
+void MapContext::cleanup() {
view.notify();
// Explicit resets currently necessary because these abandon resources that need to be
diff --git a/src/mbgl/map/map_context.hpp b/src/mbgl/map/map_context.hpp
index 8894434242..81e757c4cf 100644
--- a/src/mbgl/map/map_context.hpp
+++ b/src/mbgl/map/map_context.hpp
@@ -54,6 +54,8 @@ public:
void setSourceTileCacheSize(size_t size);
void onLowMemory();
+ void cleanup();
+
// Style::Observer implementation.
void onTileDataChanged() override;
void onResourceLoadingFailed(std::exception_ptr error) override;
diff --git a/test/miscellaneous/map_context.cpp b/test/miscellaneous/map_context.cpp
index ed51923036..15061b1225 100644
--- a/test/miscellaneous/map_context.cpp
+++ b/test/miscellaneous/map_context.cpp
@@ -19,4 +19,5 @@ TEST(MapContext, DoubleStyleLoad) {
context.invokeSync(&MapContext::setStyleJSON, "", "");
context.invokeSync(&MapContext::setStyleJSON, "", "");
+ context.invokeSync(&MapContext::cleanup);
}