summaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
authorvmpstr@chromium.org <vmpstr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-28 01:35:13 +0000
committervmpstr@chromium.org <vmpstr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-28 01:35:13 +0000
commit08e2f7c639bb96f28df6d3149e7915ef668261f0 (patch)
tree9c7c85a9c016eab0f7c14b80d8ed859fabe1a617 /cc
parentd551123a370a7ea3410e6f7b290ab0828e953a85 (diff)
downloadchromium_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.cc15
-rw-r--r--cc/resources/tile_manager.h1
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_;