Index: cc/raster/single_thread_task_graph_runner.cc |
diff --git a/cc/raster/single_thread_task_graph_runner.cc b/cc/raster/single_thread_task_graph_runner.cc |
index 24994c953df20d703063d369d128bfed03c1ac20..80c85db310196e2c69c748eb398995ad2881b7e6 100644 |
--- a/cc/raster/single_thread_task_graph_runner.cc |
+++ b/cc/raster/single_thread_task_graph_runner.cc |
@@ -112,7 +112,7 @@ void SingleThreadTaskGraphRunner::Run() { |
base::AutoLock lock(lock_); |
while (true) { |
- if (!work_queue_.HasReadyToRunTasks()) { |
+ if (!RunTaskWithLockAcquired()) { |
// Exit when shutdown is set and no more tasks are pending. |
if (shutdown_) |
break; |
@@ -121,18 +121,29 @@ void SingleThreadTaskGraphRunner::Run() { |
has_ready_to_run_tasks_cv_.Wait(); |
continue; |
} |
- |
- RunTaskWithLockAcquired(); |
} |
} |
-void SingleThreadTaskGraphRunner::RunTaskWithLockAcquired() { |
+bool SingleThreadTaskGraphRunner::RunTaskWithLockAcquired() { |
TRACE_EVENT0("toplevel", |
"SingleThreadTaskGraphRunner::RunTaskWithLockAcquired"); |
lock_.AssertAcquired(); |
- auto prioritized_task = work_queue_.GetNextTaskToRun(); |
+ // Find the first category with any tasks to run. This task graph runner |
+ // treats categories as an additional priority. |
+ const auto& ready_to_run_namespaces = work_queue_.ready_to_run_namespaces(); |
+ auto found = std::find_if( |
+ ready_to_run_namespaces.cbegin(), ready_to_run_namespaces.cend(), |
+ [](const std::pair<uint16_t, TaskGraphWorkQueue::TaskNamespace::Vector>& |
+ pair) { return !pair.second.empty(); }); |
+ |
+ if (found == ready_to_run_namespaces.cend()) { |
+ return false; |
+ } |
+ |
+ const uint16_t category = found->first; |
+ auto prioritized_task = work_queue_.GetNextTaskToRun(category); |
Task* task = prioritized_task.task; |
// Call WillRun() before releasing |lock_| and running task. |
@@ -152,6 +163,8 @@ void SingleThreadTaskGraphRunner::RunTaskWithLockAcquired() { |
if (work_queue_.HasFinishedRunningTasksInNamespace( |
prioritized_task.task_namespace)) |
has_namespaces_with_finished_running_tasks_cv_.Signal(); |
+ |
+ return true; |
} |
} // namespace cc |