Index: content/renderer/raster_worker_pool.cc |
diff --git a/content/renderer/raster_worker_pool.cc b/content/renderer/raster_worker_pool.cc |
index 89ed6d62b91c65a83fe32912336df4cdf8ebd4d4..ddeb57dfc709f60c9240ae0b402fcdb16dd5bc65 100644 |
--- a/content/renderer/raster_worker_pool.cc |
+++ b/content/renderer/raster_worker_pool.cc |
@@ -4,6 +4,8 @@ |
#include "content/renderer/raster_worker_pool.h" |
+#include <utility> |
+ |
#include "base/strings/stringprintf.h" |
#include "base/threading/thread_restrictions.h" |
#include "base/trace_event/trace_event.h" |
@@ -47,7 +49,8 @@ class RasterWorkerPool::RasterWorkerPoolSequencedTaskRunner |
if (!graph_.nodes.empty()) |
dependencies = 1; |
- cc::TaskGraph::Node node(graph_task.get(), 0, dependencies); |
+ cc::TaskGraph::Node node(graph_task.get(), 0u /* category */, |
+ 0u /* priority */, dependencies); |
if (dependencies) { |
graph_.edges.push_back( |
cc::TaskGraph::Edge(graph_.nodes.back().task, node.task)); |
@@ -148,7 +151,9 @@ bool RasterWorkerPool::PostDelayedTask( |
tasks_.push_back(make_scoped_refptr(new ClosureTask(task))); |
graph_.Reset(); |
for (const auto& graph_task : tasks_) |
- graph_.nodes.push_back(cc::TaskGraph::Node(graph_task.get(), 0, 0)); |
+ graph_.nodes.push_back( |
+ cc::TaskGraph::Node(graph_task.get(), 0u /* category */, |
+ 0u /* priority */, 0u /* dependencies */)); |
ScheduleTasksWithLockAcquired(namespace_token_, &graph_); |
completed_tasks_.clear(); |
@@ -164,7 +169,7 @@ void RasterWorkerPool::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; |
@@ -173,8 +178,6 @@ void RasterWorkerPool::Run() { |
has_ready_to_run_tasks_cv_.Wait(); |
continue; |
} |
- |
- RunTaskWithLockAcquired(); |
} |
} |
@@ -258,12 +261,28 @@ void RasterWorkerPool::CollectCompletedTasksWithLockAcquired( |
work_queue_.CollectCompletedTasks(token, completed_tasks); |
} |
-void RasterWorkerPool::RunTaskWithLockAcquired() { |
+bool RasterWorkerPool::RunTaskWithLockAcquired() { |
TRACE_EVENT0("toplevel", "TaskGraphRunner::RunTask"); |
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. |
+ // TODO(ericrk): Add more category/thread logic. |
+ 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, |
+ cc::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); |
cc::Task* task = prioritized_task.task; |
// There may be more work available, so wake up another worker thread. |
@@ -288,6 +307,8 @@ void RasterWorkerPool::RunTaskWithLockAcquired() { |
if (work_queue_.HasFinishedRunningTasksInNamespace( |
prioritized_task.task_namespace)) |
has_namespaces_with_finished_running_tasks_cv_.Broadcast(); |
+ |
+ return true; |
} |
RasterWorkerPool::ClosureTask::ClosureTask(const base::Closure& closure) |