diff options
author | reveman@chromium.org <reveman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-14 17:07:39 +0000 |
---|---|---|
committer | reveman@chromium.org <reveman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-14 17:07:39 +0000 |
commit | 5dd0ce66ec79ce14c5391ce35d290d1a12bb3dbc (patch) | |
tree | 158f9d75e3128ff0a33613ded0f48b15b8b9a9f5 /cc | |
parent | 2c716f9958ab05db3ab7be57c30e893d57d289d3 (diff) | |
download | chromium_src-5dd0ce66ec79ce14c5391ce35d290d1a12bb3dbc.zip chromium_src-5dd0ce66ec79ce14c5391ce35d290d1a12bb3dbc.tar.gz chromium_src-5dd0ce66ec79ce14c5391ce35d290d1a12bb3dbc.tar.bz2 |
Revert 257031 "cc: RasterWorkerPoolDelegate might leave RasterWo..."
Causing signal accounting in RasterWorkerPoolDelegate to be wrong.
> 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
TBR=reveman@chromium.org
Review URL: https://codereview.chromium.org/200283005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@257138 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, 14 insertions, 7 deletions
diff --git a/cc/resources/raster_worker_pool_delegate.cc b/cc/resources/raster_worker_pool_delegate.cc index 24456e8..690b135 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), - has_scheduled_tasks_(num_raster_worker_pools, false), + did_finish_running_tasks_pending_(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,14 +50,13 @@ 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 - // some currently scheduled tasks. - if (raster_queue[i].items.empty() && !has_scheduled_tasks_[i]) + // pending DidFinishRunningTasks notifications. + if (raster_queue[i].items.empty() && !did_finish_running_tasks_pending_[i]) continue; - has_scheduled_tasks_[i] = !raster_queue[i].items.empty(); - raster_worker_pools_[i]->ScheduleTasks(&raster_queue[i]); - + did_finish_running_tasks_pending_[i] = true; ++did_finish_running_tasks_pending_count; + raster_worker_pools_[i]->ScheduleTasks(&raster_queue[i]); } did_finish_running_tasks_pending_count_ = @@ -120,6 +119,14 @@ 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 931d163..3eec088 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> has_scheduled_tasks_; + std::vector<bool> did_finish_running_tasks_pending_; 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_; |