diff options
author | reveman@chromium.org <reveman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-14 06:16:43 +0000 |
---|---|---|
committer | reveman@chromium.org <reveman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-14 06:16:43 +0000 |
commit | 5769d7b7b95e03f358eec6c816d0b6580d67b76a (patch) | |
tree | 979f0677b71e983a9101842565fdfcdf301394d8 /cc | |
parent | 9123f55abcba591f96e2cdb4d2e2074b5b87179c (diff) | |
download | chromium_src-5769d7b7b95e03f358eec6c816d0b6580d67b76a.zip chromium_src-5769d7b7b95e03f358eec6c816d0b6580d67b76a.tar.gz chromium_src-5769d7b7b95e03f358eec6c816d0b6580d67b76a.tar.bz2 |
cc: RasterWorkerPoolDelegate might leave RasterWorkerPool instances with invalid tasks.
RasterWorkerPoolDelegate can only avoid calls to RWP::ScheduleTasks
when no tasks are currently scheduled. Skipping the call when some
tasks are scheduled might leave the RWP instance with references to
deleted tasks.
This change makes sure we always schedule a new task queue unless no
tasks are currently scheduled.
BUG=350045,349135
Review URL: https://codereview.chromium.org/199083007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@257031 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc')
-rw-r--r-- | cc/resources/raster_worker_pool_delegate.cc | 19 | ||||
-rw-r--r-- | cc/resources/raster_worker_pool_delegate.h | 2 |
2 files changed, 7 insertions, 14 deletions
diff --git a/cc/resources/raster_worker_pool_delegate.cc b/cc/resources/raster_worker_pool_delegate.cc index 690b135..24456e8 100644 --- a/cc/resources/raster_worker_pool_delegate.cc +++ b/cc/resources/raster_worker_pool_delegate.cc @@ -15,7 +15,7 @@ RasterWorkerPoolDelegate::RasterWorkerPoolDelegate( task_runner_(task_runner), raster_worker_pools_(raster_worker_pools, raster_worker_pools + num_raster_worker_pools), - did_finish_running_tasks_pending_(num_raster_worker_pools, false), + has_scheduled_tasks_(num_raster_worker_pools, false), did_finish_running_tasks_pending_count_(0u), did_finish_running_tasks_required_for_activation_pending_count_(0u), run_did_finish_running_tasks_pending_(false), @@ -50,13 +50,14 @@ void RasterWorkerPoolDelegate::ScheduleTasks(RasterTaskQueue* raster_queue) { size_t did_finish_running_tasks_pending_count = 0u; for (size_t i = 0u; i < raster_worker_pools_.size(); ++i) { // Empty queue doesn't have to be scheduled unless raster worker pool has - // pending DidFinishRunningTasks notifications. - if (raster_queue[i].items.empty() && !did_finish_running_tasks_pending_[i]) + // some currently scheduled tasks. + if (raster_queue[i].items.empty() && !has_scheduled_tasks_[i]) continue; - did_finish_running_tasks_pending_[i] = true; - ++did_finish_running_tasks_pending_count; + has_scheduled_tasks_[i] = !raster_queue[i].items.empty(); raster_worker_pools_[i]->ScheduleTasks(&raster_queue[i]); + + ++did_finish_running_tasks_pending_count; } did_finish_running_tasks_pending_count_ = @@ -119,14 +120,6 @@ void RasterWorkerPoolDelegate::RunDidFinishRunningTasks() { if (!did_finish_running_tasks_pending_count_) client_->DidFinishRunningTasks(); - - // Reset |run_did_finish_running_tasks_pending_| vector if no notifications - // are pending. - if (!did_finish_running_tasks_required_for_activation_pending_count_ && - !did_finish_running_tasks_pending_count_) { - did_finish_running_tasks_pending_.assign( - did_finish_running_tasks_pending_.size(), false); - } } } // namespace cc diff --git a/cc/resources/raster_worker_pool_delegate.h b/cc/resources/raster_worker_pool_delegate.h index 3eec088..931d163 100644 --- a/cc/resources/raster_worker_pool_delegate.h +++ b/cc/resources/raster_worker_pool_delegate.h @@ -46,7 +46,7 @@ class RasterWorkerPoolDelegate : public RasterWorkerPoolClient { scoped_refptr<base::SequencedTaskRunner> task_runner_; typedef std::vector<RasterWorkerPool*> RasterWorkerPoolVector; RasterWorkerPoolVector raster_worker_pools_; - std::vector<bool> did_finish_running_tasks_pending_; + std::vector<bool> has_scheduled_tasks_; size_t did_finish_running_tasks_pending_count_; size_t did_finish_running_tasks_required_for_activation_pending_count_; bool run_did_finish_running_tasks_pending_; |