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.
This commit is contained in:
Thiago Marcos P. Santos
2015-05-29 15:30:50 +03:00
parent 29b8b44b77
commit b09df7acb5
4 changed files with 9 additions and 0 deletions

View File

@@ -17,6 +17,7 @@ Map::Map(View& view, FileSource& fileSource, MapMode mode)
Map::~Map() {
resume();
context->invoke(&MapContext::cleanup);
}
void Map::pause() {

View File

@@ -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

View File

@@ -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;

View File

@@ -19,4 +19,5 @@ TEST(MapContext, DoubleStyleLoad) {
context.invokeSync(&MapContext::setStyleJSON, "", "");
context.invokeSync(&MapContext::setStyleJSON, "", "");
context.invokeSync(&MapContext::cleanup);
}