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