summaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
authorreveman@chromium.org <reveman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-14 17:07:39 +0000
committerreveman@chromium.org <reveman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-14 17:07:39 +0000
commit5dd0ce66ec79ce14c5391ce35d290d1a12bb3dbc (patch)
tree158f9d75e3128ff0a33613ded0f48b15b8b9a9f5 /cc
parent2c716f9958ab05db3ab7be57c30e893d57d289d3 (diff)
downloadchromium_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.cc19
-rw-r--r--cc/resources/raster_worker_pool_delegate.h2
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_;