OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/synchronous_task_graph_runner.h" | 5 #include "cc/raster/synchronous_task_graph_runner.h" |
6 | 6 |
| 7 #include <algorithm> |
| 8 #include <utility> |
| 9 |
7 #include "base/threading/simple_thread.h" | 10 #include "base/threading/simple_thread.h" |
8 #include "base/threading/thread_restrictions.h" | 11 #include "base/threading/thread_restrictions.h" |
9 #include "base/trace_event/trace_event.h" | 12 #include "base/trace_event/trace_event.h" |
10 | 13 |
11 namespace cc { | 14 namespace cc { |
12 | 15 |
13 SynchronousTaskGraphRunner::SynchronousTaskGraphRunner() {} | 16 SynchronousTaskGraphRunner::SynchronousTaskGraphRunner() {} |
14 | 17 |
15 SynchronousTaskGraphRunner::~SynchronousTaskGraphRunner() { | 18 SynchronousTaskGraphRunner::~SynchronousTaskGraphRunner() { |
16 DCHECK(!work_queue_.HasReadyToRunTasks()); | 19 DCHECK(!work_queue_.HasReadyToRunTasks()); |
(...skipping 17 matching lines...) Expand all Loading... |
34 void SynchronousTaskGraphRunner::WaitForTasksToFinishRunning( | 37 void SynchronousTaskGraphRunner::WaitForTasksToFinishRunning( |
35 NamespaceToken token) { | 38 NamespaceToken token) { |
36 TRACE_EVENT0("cc", "SynchronousTaskGraphRunner::WaitForTasksToFinishRunning"); | 39 TRACE_EVENT0("cc", "SynchronousTaskGraphRunner::WaitForTasksToFinishRunning"); |
37 | 40 |
38 DCHECK(token.IsValid()); | 41 DCHECK(token.IsValid()); |
39 auto* task_namespace = work_queue_.GetNamespaceForToken(token); | 42 auto* task_namespace = work_queue_.GetNamespaceForToken(token); |
40 | 43 |
41 if (!task_namespace) | 44 if (!task_namespace) |
42 return; | 45 return; |
43 | 46 |
44 while ( | 47 while (!work_queue_.HasFinishedRunningTasksInNamespace(task_namespace)) { |
45 !TaskGraphWorkQueue::HasFinishedRunningTasksInNamespace(task_namespace)) { | 48 bool succeeded = RunTask(); |
46 RunTask(); | 49 DCHECK(succeeded); |
47 } | 50 } |
48 } | 51 } |
49 | 52 |
50 void SynchronousTaskGraphRunner::CollectCompletedTasks( | 53 void SynchronousTaskGraphRunner::CollectCompletedTasks( |
51 NamespaceToken token, | 54 NamespaceToken token, |
52 Task::Vector* completed_tasks) { | 55 Task::Vector* completed_tasks) { |
53 TRACE_EVENT0("cc", "SynchronousTaskGraphRunner::CollectCompletedTasks"); | 56 TRACE_EVENT0("cc", "SynchronousTaskGraphRunner::CollectCompletedTasks"); |
54 | 57 |
55 DCHECK(token.IsValid()); | 58 DCHECK(token.IsValid()); |
56 work_queue_.CollectCompletedTasks(token, completed_tasks); | 59 work_queue_.CollectCompletedTasks(token, completed_tasks); |
57 } | 60 } |
58 | 61 |
59 void SynchronousTaskGraphRunner::RunUntilIdle() { | 62 void SynchronousTaskGraphRunner::RunUntilIdle() { |
60 while (work_queue_.HasReadyToRunTasks()) | 63 while (RunTask()) { |
61 RunTask(); | 64 } |
62 } | 65 } |
63 | 66 |
64 void SynchronousTaskGraphRunner::RunTask() { | 67 bool SynchronousTaskGraphRunner::RunTask() { |
65 TRACE_EVENT0("toplevel", "SynchronousTaskGraphRunner::RunTask"); | 68 TRACE_EVENT0("toplevel", "SynchronousTaskGraphRunner::RunTask"); |
66 | 69 |
67 auto prioritized_task = work_queue_.GetNextTaskToRun(); | 70 // Find the first category with any tasks to run. This task graph runner |
| 71 // treats categories as an additional priority. |
| 72 const auto& ready_to_run_namespaces = work_queue_.ready_to_run_namespaces(); |
| 73 auto found = std::find_if( |
| 74 ready_to_run_namespaces.cbegin(), ready_to_run_namespaces.cend(), |
| 75 [](const std::pair<uint16_t, TaskGraphWorkQueue::TaskNamespace::Vector>& |
| 76 pair) { return !pair.second.empty(); }); |
| 77 |
| 78 if (found == ready_to_run_namespaces.cend()) { |
| 79 return false; |
| 80 } |
| 81 |
| 82 const uint16_t category = found->first; |
| 83 auto prioritized_task = work_queue_.GetNextTaskToRun(category); |
68 | 84 |
69 Task* task = prioritized_task.task; | 85 Task* task = prioritized_task.task; |
70 task->WillRun(); | 86 task->WillRun(); |
71 task->RunOnWorkerThread(); | 87 task->RunOnWorkerThread(); |
72 task->DidRun(); | 88 task->DidRun(); |
73 | 89 |
74 work_queue_.CompleteTask(prioritized_task); | 90 work_queue_.CompleteTask(prioritized_task); |
| 91 |
| 92 return true; |
75 } | 93 } |
76 | 94 |
77 } // namespace cc | 95 } // namespace cc |
OLD | NEW |