Chromium Code Reviews| Index: cc/resources/pixel_buffer_raster_worker_pool.cc |
| diff --git a/cc/resources/pixel_buffer_raster_worker_pool.cc b/cc/resources/pixel_buffer_raster_worker_pool.cc |
| index 574065e23f59e88ab8599b885e43f1568ddc840b..8eca51b549740985d47a3d25cc7153fb268d7131 100644 |
| --- a/cc/resources/pixel_buffer_raster_worker_pool.cc |
| +++ b/cc/resources/pixel_buffer_raster_worker_pool.cc |
| @@ -97,6 +97,10 @@ void AddDependenciesToGraphNode( |
| } |
| } |
| +bool WasCanceled(const internal::RasterWorkerPoolTask* task) { |
|
vmpstr
2013/07/10 16:46:49
If this is only for a DCHECK, maybe we can name it
reveman
2013/07/11 00:37:21
ForDebug in the name makes it sound like it's chec
|
| + return task->WasCanceled(); |
| +} |
| + |
| } // namespace |
| PixelBufferRasterWorkerPool::PixelBufferRasterWorkerPool( |
| @@ -200,6 +204,14 @@ void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { |
| tasks_required_for_activation_.insert(task); |
| } |
| + // |tasks_required_for_activation_| contains all tasks that need to |
| + // complete before we can send a "ready to activate" signal. Tasks |
| + // that have already completed should not be part of this set. |
| + for (TaskDeque::const_iterator it = completed_tasks_.begin(); |
|
vmpstr
2013/07/10 16:46:49
I think we can fold this loop and the one above in
reveman
2013/07/11 00:37:21
This and ScheduleMoreTasks needs a rewrite at some
|
| + it != completed_tasks_.end(); ++it) { |
| + tasks_required_for_activation_.erase(*it); |
| + } |
| + |
| pixel_buffer_tasks_.swap(new_pixel_buffer_tasks); |
| // Check for completed tasks when ScheduleTasks() is called as |
| @@ -409,10 +421,16 @@ void PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks() { |
| ScheduleCheckForCompletedRasterTasks(); |
| // Generate client notifications. |
| - if (will_notify_client_that_no_tasks_required_for_activation_are_pending) |
| + if (will_notify_client_that_no_tasks_required_for_activation_are_pending) { |
| + DCHECK(std::find_if(raster_tasks_required_for_activation().begin(), |
| + raster_tasks_required_for_activation().end(), |
| + WasCanceled) == |
| + raster_tasks_required_for_activation().end()); |
| client()->DidFinishedRunningTasksRequiredForActivation(); |
| + } |
| if (will_notify_client_that_no_tasks_are_pending) { |
| TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); |
| + DCHECK(!HasPendingTasksRequiredForActivation()); |
| client()->DidFinishedRunningTasks(); |
| } |
| } |
| @@ -582,6 +600,19 @@ void PixelBufferRasterWorkerPool::OnRasterTaskCompleted( |
| if (!needs_upload) { |
| resource_provider()->ReleasePixelBuffer(task->resource()->id()); |
| + |
| + if (was_canceled) { |
|
vmpstr
2013/07/10 16:46:49
Does was_canceled guarantee that needs_upload is f
reveman
2013/07/11 00:37:21
Yes, see PixelBufferWorkerPoolTaskImpl above. I ad
|
| + // When priorites change, a raster task can be canceled as a result of |
| + // no longer being of high enough priority to fit in our throttled |
| + // raster task budget. The task has not yet completed in this case. |
| + if (std::find(raster_tasks().begin(), |
|
vmpstr
2013/07/10 16:46:49
I prefer you save the iterator first, then do the
reveman
2013/07/11 00:37:21
Done.
|
| + raster_tasks().end(), |
| + task) != raster_tasks().end()) { |
| + pixel_buffer_tasks_[task.get()] = NULL; |
| + return; |
| + } |
| + } |
| + |
| task->DidRun(was_canceled); |
| DCHECK(std::find(completed_tasks_.begin(), |
| completed_tasks_.end(), |