From 0439d003135dbdd15a993efff712e27cd15ab89e Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Thu, 28 Jan 2016 11:26:39 -0800 Subject: [PATCH] [core] fix redoPlacement blocking main thread, fix #3727 If a workRequest exists, don't cancel it and start an new request. It's ok to just do nothing if the request exists because a new call to redoPlacement will be triggered after the existing request finishes. this fixes a regression in e44db93f1cb3276dcdc7de8400ca96beda1b1d30 --- src/mbgl/map/vector_tile_data.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/mbgl/map/vector_tile_data.cpp b/src/mbgl/map/vector_tile_data.cpp index df7923273..27172a3e6 100644 --- a/src/mbgl/map/vector_tile_data.cpp +++ b/src/mbgl/map/vector_tile_data.cpp @@ -144,16 +144,15 @@ void VectorTileData::redoPlacement(const PlacementConfig newConfig, const std::f if (newConfig != placedConfig) { targetConfig = newConfig; - if (!workRequest) { - // Don't start a new placement request when the current one hasn't completed yet, or when - // we are parsing buckets. - redoPlacement(callback); - } + redoPlacement(callback); } } void VectorTileData::redoPlacement(const std::function& callback) { - workRequest.reset(); + // Don't start a new placement request when the current one hasn't completed yet, or when + // we are parsing buckets. + if (workRequest) return; + workRequest = worker.redoPlacement(tileWorker, buckets, targetConfig, [this, callback, config = targetConfig] { workRequest.reset();