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..a961d3b631afbac36eb18b1dac77ee37e30813a9 100644 |
--- a/cc/resources/pixel_buffer_raster_worker_pool.cc |
+++ b/cc/resources/pixel_buffer_raster_worker_pool.cc |
@@ -97,6 +97,11 @@ void AddDependenciesToGraphNode( |
} |
} |
+// Only used as std::find_if predicate for DCHECKs. |
+bool WasCanceled(const internal::RasterWorkerPoolTask* task) { |
+ return task->WasCanceled(); |
+} |
+ |
} // namespace |
PixelBufferRasterWorkerPool::PixelBufferRasterWorkerPool( |
@@ -200,6 +205,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(); |
+ 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 +422,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 +601,20 @@ void PixelBufferRasterWorkerPool::OnRasterTaskCompleted( |
if (!needs_upload) { |
resource_provider()->ReleasePixelBuffer(task->resource()->id()); |
+ |
+ if (was_canceled) { |
+ // 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. |
+ RasterTaskVector::const_iterator it = std::find(raster_tasks().begin(), |
+ raster_tasks().end(), |
+ task); |
+ if (it != raster_tasks().end()) { |
+ pixel_buffer_tasks_[task.get()] = NULL; |
+ return; |
+ } |
+ } |
+ |
task->DidRun(was_canceled); |
DCHECK(std::find(completed_tasks_.begin(), |
completed_tasks_.end(), |
@@ -591,6 +624,8 @@ void PixelBufferRasterWorkerPool::OnRasterTaskCompleted( |
return; |
} |
+ DCHECK(!was_canceled); |
vmpstr
2013/07/11 17:55:12
nit: I would also prefer DCHECK(!was_canceled || !
vmpstr
2013/07/11 18:12:55
Nevermind this, I missed the fact that the if retu
|
+ |
resource_provider()->BeginSetPixels(task->resource()->id()); |
has_performed_uploads_since_last_flush_ = true; |