Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(120)

Side by Side Diff: cc/raster/task_graph_work_queue.cc

Issue 1854723002: cc: Simplify task and its derived classes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/raster/task_graph_work_queue.h" 5 #include "cc/raster/task_graph_work_queue.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 NamespaceToken TaskGraphWorkQueue::GetNamespaceToken() { 58 NamespaceToken TaskGraphWorkQueue::GetNamespaceToken() {
59 NamespaceToken token(next_namespace_id_++); 59 NamespaceToken token(next_namespace_id_++);
60 DCHECK(namespaces_.find(token) == namespaces_.end()); 60 DCHECK(namespaces_.find(token) == namespaces_.end());
61 return token; 61 return token;
62 } 62 }
63 63
64 void TaskGraphWorkQueue::ScheduleTasks(NamespaceToken token, TaskGraph* graph) { 64 void TaskGraphWorkQueue::ScheduleTasks(NamespaceToken token, TaskGraph* graph) {
65 TaskNamespace& task_namespace = namespaces_[token]; 65 TaskNamespace& task_namespace = namespaces_[token];
66 66
67 // First adjust number of dependencies to reflect completed tasks. 67 // First adjust number of dependencies to reflect completed tasks.
68 for (const scoped_refptr<Task>& task : task_namespace.completed_tasks) { 68 for (const scoped_refptr<DependencyTask>& task :
69 task_namespace.completed_tasks) {
69 for (DependentIterator node_it(graph, task.get()); node_it; ++node_it) { 70 for (DependentIterator node_it(graph, task.get()); node_it; ++node_it) {
70 TaskGraph::Node& node = *node_it; 71 TaskGraph::Node& node = *node_it;
71 DCHECK_LT(0u, node.dependencies); 72 DCHECK_LT(0u, node.dependencies);
72 node.dependencies--; 73 node.dependencies--;
73 } 74 }
74 } 75 }
75 76
76 // Build new "ready to run" queue and remove nodes from old graph. 77 // Build new "ready to run" queue and remove nodes from old graph.
77 for (auto& ready_to_run_tasks_it : task_namespace.ready_to_run_tasks) { 78 for (auto& ready_to_run_tasks_it : task_namespace.ready_to_run_tasks) {
78 ready_to_run_tasks_it.second.clear(); 79 ready_to_run_tasks_it.second.clear();
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 204
204 // Add task to |running_tasks|. 205 // Add task to |running_tasks|.
205 task_namespace->running_tasks.push_back( 206 task_namespace->running_tasks.push_back(
206 std::make_pair(task.category, task.task)); 207 std::make_pair(task.category, task.task));
207 208
208 return task; 209 return task;
209 } 210 }
210 211
211 void TaskGraphWorkQueue::CompleteTask(const PrioritizedTask& completed_task) { 212 void TaskGraphWorkQueue::CompleteTask(const PrioritizedTask& completed_task) {
212 TaskNamespace* task_namespace = completed_task.task_namespace; 213 TaskNamespace* task_namespace = completed_task.task_namespace;
213 scoped_refptr<Task> task(completed_task.task); 214 scoped_refptr<DependencyTask> task(completed_task.task);
214 215
215 // Remove task from |running_tasks|. 216 // Remove task from |running_tasks|.
216 auto it = std::find_if(task_namespace->running_tasks.begin(), 217 auto it = std::find_if(task_namespace->running_tasks.begin(),
217 task_namespace->running_tasks.end(), 218 task_namespace->running_tasks.end(),
218 [&completed_task](const CategorizedTask& task) { 219 [&completed_task](const CategorizedTask& task) {
219 return task.second == completed_task.task; 220 return task.second == completed_task.task;
220 }); 221 });
221 DCHECK(it != task_namespace->running_tasks.end()); 222 DCHECK(it != task_namespace->running_tasks.end());
222 std::swap(*it, task_namespace->running_tasks.back()); 223 std::swap(*it, task_namespace->running_tasks.back());
223 task_namespace->running_tasks.pop_back(); 224 task_namespace->running_tasks.pop_back();
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 std::make_heap(ready_to_run_namespaces.begin(), 267 std::make_heap(ready_to_run_namespaces.begin(),
267 ready_to_run_namespaces.end(), 268 ready_to_run_namespaces.end(),
268 CompareTaskNamespacePriority(category)); 269 CompareTaskNamespacePriority(category));
269 } 270 }
270 } 271 }
271 272
272 // Finally add task to |completed_tasks_|. 273 // Finally add task to |completed_tasks_|.
273 task_namespace->completed_tasks.push_back(task); 274 task_namespace->completed_tasks.push_back(task);
274 } 275 }
275 276
276 void TaskGraphWorkQueue::CollectCompletedTasks(NamespaceToken token, 277 void TaskGraphWorkQueue::CollectCompletedTasks(
277 Task::Vector* completed_tasks) { 278 NamespaceToken token,
279 DependencyTask::Vector* completed_tasks) {
278 TaskNamespaceMap::iterator it = namespaces_.find(token); 280 TaskNamespaceMap::iterator it = namespaces_.find(token);
279 if (it == namespaces_.end()) 281 if (it == namespaces_.end())
280 return; 282 return;
281 283
282 TaskNamespace& task_namespace = it->second; 284 TaskNamespace& task_namespace = it->second;
283 285
284 DCHECK_EQ(0u, completed_tasks->size()); 286 DCHECK_EQ(0u, completed_tasks->size());
285 completed_tasks->swap(task_namespace.completed_tasks); 287 completed_tasks->swap(task_namespace.completed_tasks);
286 if (!HasFinishedRunningTasksInNamespace(&task_namespace)) 288 if (!HasFinishedRunningTasksInNamespace(&task_namespace))
287 return; 289 return;
288 290
289 // Remove namespace if finished running tasks. 291 // Remove namespace if finished running tasks.
290 DCHECK_EQ(0u, task_namespace.completed_tasks.size()); 292 DCHECK_EQ(0u, task_namespace.completed_tasks.size());
291 DCHECK(!HasReadyToRunTasksInNamespace(&task_namespace)); 293 DCHECK(!HasReadyToRunTasksInNamespace(&task_namespace));
292 DCHECK_EQ(0u, task_namespace.running_tasks.size()); 294 DCHECK_EQ(0u, task_namespace.running_tasks.size());
293 namespaces_.erase(it); 295 namespaces_.erase(it);
294 } 296 }
295 297
296 bool TaskGraphWorkQueue::DependencyMismatch(const TaskGraph* graph) { 298 bool TaskGraphWorkQueue::DependencyMismatch(const TaskGraph* graph) {
297 // Value storage will be 0-initialized. 299 // Value storage will be 0-initialized.
298 std::unordered_map<const Task*, size_t> dependents; 300 std::unordered_map<const DependencyTask*, size_t> dependents;
299 for (const TaskGraph::Edge& edge : graph->edges) 301 for (const TaskGraph::Edge& edge : graph->edges)
300 dependents[edge.dependent]++; 302 dependents[edge.dependent]++;
301 303
302 for (const TaskGraph::Node& node : graph->nodes) { 304 for (const TaskGraph::Node& node : graph->nodes) {
303 if (dependents[node.task] != node.dependencies) 305 if (dependents[node.task] != node.dependencies)
304 return true; 306 return true;
305 } 307 }
306 308
307 return false; 309 return false;
308 } 310 }
309 311
310 } // namespace cc 312 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698