Chromium Code Reviews| 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..da85c774ad2a827ad0a8db75e26eafea93434ac1 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,19 @@ 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(); |
| + |
| + // If |running_tasks_for_category| is empty, remove it from |running_tasks|. |
|
reveman
2016/02/10 20:49:32
Is this necessary? Doesn't it cause some heap allo
ericrk
2016/02/10 22:30:04
I guess it's a trade-off - we either do this here
|
| + if (running_tasks_for_category.size() == 0) |
| + task_namespace->running_tasks.erase(category); |
| // Now iterate over all dependents to decrement dependencies and check if they |
| // are ready to run. |