| Index: cc/raster/task_graph_work_queue.cc
|
| diff --git a/cc/raster/task_graph_work_queue.cc b/cc/raster/task_graph_work_queue.cc
|
| index 29474023c6539a17ab44c9cc8b0b0d67645dd635..0b59822bb4bce10c8a344eff492728b241bf6d48 100644
|
| --- a/cc/raster/task_graph_work_queue.cc
|
| +++ b/cc/raster/task_graph_work_queue.cc
|
| @@ -97,9 +97,12 @@ void TaskGraphWorkQueue::ScheduleTasks(NamespaceToken token, TaskGraph* graph) {
|
| continue;
|
|
|
| // Skip if already running.
|
| - if (std::find(task_namespace.running_tasks.begin(),
|
| - task_namespace.running_tasks.end(),
|
| - node.task) != task_namespace.running_tasks.end())
|
| + const auto& running_tasks_for_category =
|
| + task_namespace.running_tasks.find(node.category);
|
| + if (running_tasks_for_category != task_namespace.running_tasks.cend() &&
|
| + std::find(running_tasks_for_category->second.cbegin(),
|
| + running_tasks_for_category->second.cend(),
|
| + node.task) != running_tasks_for_category->second.cend())
|
| continue;
|
|
|
| task_namespace.ready_to_run_tasks[node.category].push_back(PrioritizedTask(
|
| @@ -127,9 +130,12 @@ void TaskGraphWorkQueue::ScheduleTasks(NamespaceToken token, TaskGraph* graph) {
|
| continue;
|
|
|
| // Skip if already running.
|
| - if (std::find(task_namespace.running_tasks.begin(),
|
| - task_namespace.running_tasks.end(),
|
| - node.task) != task_namespace.running_tasks.end())
|
| + const auto& running_tasks_for_category =
|
| + task_namespace.running_tasks.find(node.category);
|
| + if (running_tasks_for_category != task_namespace.running_tasks.cend() &&
|
| + std::find(running_tasks_for_category->second.cbegin(),
|
| + running_tasks_for_category->second.cend(),
|
| + node.task) != running_tasks_for_category->second.cend())
|
| continue;
|
|
|
| DCHECK(std::find(task_namespace.completed_tasks.begin(),
|
| @@ -195,7 +201,7 @@ TaskGraphWorkQueue::PrioritizedTask TaskGraphWorkQueue::GetNextTaskToRun(
|
| }
|
|
|
| // Add task to |running_tasks|.
|
| - task_namespace->running_tasks.push_back(task.task);
|
| + task_namespace->running_tasks[category].push_back(task.task);
|
|
|
| return task;
|
| }
|
| @@ -203,13 +209,15 @@ TaskGraphWorkQueue::PrioritizedTask TaskGraphWorkQueue::GetNextTaskToRun(
|
| void TaskGraphWorkQueue::CompleteTask(const PrioritizedTask& completed_task) {
|
| TaskNamespace* task_namespace = completed_task.task_namespace;
|
| scoped_refptr<Task> task(completed_task.task);
|
| + uint16_t category = completed_task.category;
|
|
|
| // Remove task from |running_tasks|.
|
| - auto it = std::find(task_namespace->running_tasks.begin(),
|
| - task_namespace->running_tasks.end(), task);
|
| - DCHECK(it != task_namespace->running_tasks.end());
|
| - std::swap(*it, task_namespace->running_tasks.back());
|
| - task_namespace->running_tasks.pop_back();
|
| + auto& running_tasks_for_category = task_namespace->running_tasks[category];
|
| + auto it = std::find(running_tasks_for_category.begin(),
|
| + running_tasks_for_category.end(), task);
|
| + DCHECK(it != running_tasks_for_category.end());
|
| + std::swap(*it, running_tasks_for_category.back());
|
| + running_tasks_for_category.pop_back();
|
|
|
| // Now iterate over all dependents to decrement dependencies and check if they
|
| // are ready to run.
|
| @@ -277,8 +285,7 @@ void TaskGraphWorkQueue::CollectCompletedTasks(NamespaceToken token,
|
|
|
| // Remove namespace if finished running tasks.
|
| DCHECK_EQ(0u, task_namespace.completed_tasks.size());
|
| - DCHECK(!HasReadyToRunTasksInNamespace(&task_namespace));
|
| - DCHECK_EQ(0u, task_namespace.running_tasks.size());
|
| + DCHECK(HasFinishedRunningTasksInNamespace(&task_namespace));
|
| namespaces_.erase(it);
|
| }
|
|
|
|
|