diff options
author | vmpstr@chromium.org <vmpstr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-28 01:35:13 +0000 |
---|---|---|
committer | vmpstr@chromium.org <vmpstr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-28 01:35:13 +0000 |
commit | 08e2f7c639bb96f28df6d3149e7915ef668261f0 (patch) | |
tree | 9c7c85a9c016eab0f7c14b80d8ed859fabe1a617 /cc | |
parent | d551123a370a7ea3410e6f7b290ab0828e953a85 (diff) | |
download | chromium_src-08e2f7c639bb96f28df6d3149e7915ef668261f0.zip chromium_src-08e2f7c639bb96f28df6d3149e7915ef668261f0.tar.gz chromium_src-08e2f7c639bb96f28df6d3149e7915ef668261f0.tar.bz2 |
cc: Fix recursive call to TileManager::DispatchMoreTasks
Through a sequence of calls, DispatchMoreTasks can be called
recursively. Since it's not re-entrant it can cause undefined
behaviour, which caused crashes on ChromeOS and, I suspect,
on N7 when solid color prediction was turned on.
BUG=223722
Review URL: https://chromiumcodereview.appspot.com/12918027
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@191088 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc')
-rw-r--r-- | cc/resources/tile_manager.cc | 15 | ||||
-rw-r--r-- | cc/resources/tile_manager.h | 1 |
2 files changed, 14 insertions, 2 deletions
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc index c1e525d..b959bac 100644 --- a/cc/resources/tile_manager.cc +++ b/cc/resources/tile_manager.cc @@ -166,6 +166,7 @@ TileManager::TileManager( use_cheapness_estimator_(use_cheapness_estimator), use_color_estimator_(use_color_estimator), prediction_benchmarking_(prediction_benchmarking), + did_initialize_visible_tile_(false), pending_tasks_(0), max_pending_tasks_(kMaxNumPendingTasksPerThread * num_raster_threads), rendering_stats_instrumentation_(rendering_stats_instrumentation) { @@ -437,6 +438,11 @@ void TileManager::ForceTileUploadToComplete(Tile* tile) { DidTileRasterStateChange(tile, FORCED_UPLOAD_COMPLETION_STATE); DidFinishTileInitialization(tile); } + + if (did_initialize_visible_tile_) { + did_initialize_visible_tile_ = false; + client_->DidInitializeVisibleTile(); + } } void TileManager::GetMemoryStats( @@ -685,11 +691,16 @@ void TileManager::DispatchMoreTasks() { tiles_with_image_decoding_tasks_.push_back(tile); } else { if (!CanDispatchRasterTask(tile)) - return; + break; DispatchOneRasterTask(tile); } tiles_that_need_to_be_rasterized_.pop_back(); } + + if (did_initialize_visible_tile_) { + did_initialize_visible_tile_ = false; + client_->DidInitializeVisibleTile(); + } } void TileManager::AnalyzeTile(Tile* tile) { @@ -925,7 +936,7 @@ void TileManager::OnRasterTaskCompleted( void TileManager::DidFinishTileInitialization(Tile* tile) { tile->drawing_info().resource_is_being_initialized_ = false; if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) - client_->DidInitializeVisibleTile(); + did_initialize_visible_tile_ = true; } void TileManager::DidTileRasterStateChange(Tile* tile, TileRasterState state) { diff --git a/cc/resources/tile_manager.h b/cc/resources/tile_manager.h index 105d2d6..1166c04 100644 --- a/cc/resources/tile_manager.h +++ b/cc/resources/tile_manager.h @@ -217,6 +217,7 @@ class CC_EXPORT TileManager : public WorkerPoolClient { bool use_color_estimator_; int raster_state_count_[NUM_STATES][NUM_TREES][NUM_BINS]; bool prediction_benchmarking_; + bool did_initialize_visible_tile_; size_t pending_tasks_; size_t max_pending_tasks_; |