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:
@@ -17,6 +17,7 @@ Map::Map(View& view, FileSource& fileSource, MapMode mode)
|
||||
|
||||
Map::~Map() {
|
||||
resume();
|
||||
context->invoke(&MapContext::cleanup);
|
||||
}
|
||||
|
||||
void Map::pause() {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -19,4 +19,5 @@ TEST(MapContext, DoubleStyleLoad) {
|
||||
|
||||
context.invokeSync(&MapContext::setStyleJSON, "", "");
|
||||
context.invokeSync(&MapContext::setStyleJSON, "", "");
|
||||
context.invokeSync(&MapContext::cleanup);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user