Chromium Code Reviews| Index: cc/resources/raster_worker_pool_delegate.cc |
| diff --git a/cc/resources/raster_worker_pool_delegate.cc b/cc/resources/raster_worker_pool_delegate.cc |
| index 6a2edaebf48b40044db08c3359b0c6bcfc3d89ef..f91f25a0a5b0336ee2fcf9b9ea9fb9a2631c8764 100644 |
| --- a/cc/resources/raster_worker_pool_delegate.cc |
| +++ b/cc/resources/raster_worker_pool_delegate.cc |
| @@ -4,6 +4,8 @@ |
| #include "cc/resources/raster_worker_pool_delegate.h" |
| +#include "base/message_loop/message_loop_proxy.h" |
| + |
| namespace cc { |
| RasterWorkerPoolDelegate::RasterWorkerPoolDelegate( |
| @@ -13,8 +15,11 @@ RasterWorkerPoolDelegate::RasterWorkerPoolDelegate( |
| : client_(client), |
| raster_worker_pools_(raster_worker_pools, |
| raster_worker_pools + num_raster_worker_pools), |
| + 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) { |
| + did_finish_running_tasks_required_for_activation_pending_count_(0u), |
| + run_did_finish_running_tasks_pending_(false), |
| + weak_ptr_factory_(this) { |
| DCHECK(client_); |
| for (RasterWorkerPoolVector::iterator it = raster_worker_pools_.begin(); |
| it != raster_worker_pools_.end(); |
| @@ -41,12 +46,28 @@ void RasterWorkerPoolDelegate::Shutdown() { |
| } |
| void RasterWorkerPoolDelegate::ScheduleTasks(RasterTaskQueue* raster_queue) { |
| - for (size_t i = 0; i < raster_worker_pools_.size(); ++i) |
| + 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]) |
| + continue; |
| + |
| + 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_ = raster_worker_pools_.size(); |
| + did_finish_running_tasks_pending_count_ = |
| + did_finish_running_tasks_pending_count; |
| did_finish_running_tasks_required_for_activation_pending_count_ = |
| - raster_worker_pools_.size(); |
| + did_finish_running_tasks_pending_count; |
| + |
| + // Need to schedule a call to RunDidFinishRunningTasks() when no |
| + // DidFinishRunningTasks notifications are expected from raster worker pool |
| + // instances. |
| + if (!did_finish_running_tasks_pending_count) |
| + ScheduleRunDidFinishRunningTasks(); |
| } |
| void RasterWorkerPoolDelegate::CheckForCompletedTasks() { |
| @@ -58,23 +79,53 @@ void RasterWorkerPoolDelegate::CheckForCompletedTasks() { |
| bool RasterWorkerPoolDelegate::ShouldForceTasksRequiredForActivationToComplete() |
| const { |
| - DCHECK(client_); |
| return client_->ShouldForceTasksRequiredForActivationToComplete(); |
| } |
| void RasterWorkerPoolDelegate::DidFinishRunningTasks() { |
| DCHECK_LT(0u, did_finish_running_tasks_pending_count_); |
| - if (--did_finish_running_tasks_pending_count_) |
| - return; |
| - client_->DidFinishRunningTasks(); |
| + --did_finish_running_tasks_pending_count_; |
| + RunDidFinishRunningTasks(); |
| } |
| void RasterWorkerPoolDelegate::DidFinishRunningTasksRequiredForActivation() { |
| DCHECK_LT(0u, |
| did_finish_running_tasks_required_for_activation_pending_count_); |
| - if (--did_finish_running_tasks_required_for_activation_pending_count_) |
| + --did_finish_running_tasks_required_for_activation_pending_count_; |
| + RunDidFinishRunningTasks(); |
| +} |
| + |
| +void RasterWorkerPoolDelegate::ScheduleRunDidFinishRunningTasks() { |
| + if (run_did_finish_running_tasks_pending_) |
| return; |
| - client_->DidFinishRunningTasksRequiredForActivation(); |
| + |
| + base::MessageLoopProxy::current()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&RasterWorkerPoolDelegate::OnRunDidFinishRunningTasks, |
| + weak_ptr_factory_.GetWeakPtr())); |
| + run_did_finish_running_tasks_pending_ = true; |
| +} |
| + |
| +void RasterWorkerPoolDelegate::OnRunDidFinishRunningTasks() { |
| + DCHECK(run_did_finish_running_tasks_pending_); |
| + run_did_finish_running_tasks_pending_ = false; |
| + RunDidFinishRunningTasks(); |
| +} |
| + |
| +void RasterWorkerPoolDelegate::RunDidFinishRunningTasks() { |
| + if (!did_finish_running_tasks_required_for_activation_pending_count_) |
| + client_->DidFinishRunningTasksRequiredForActivation(); |
| + |
| + 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_) { |
|
reveman
2014/02/20 00:11:54
Moved this here as there's no guarantee that requi
|
| + did_finish_running_tasks_pending_.assign( |
| + did_finish_running_tasks_pending_.size(), false); |
| + } |
| } |
| } // namespace cc |