Index: cc/resources/task_graph_runner.h |
diff --git a/cc/resources/task_graph_runner.h b/cc/resources/task_graph_runner.h |
deleted file mode 100644 |
index 2ff085d76cb9fd5eac10414d2a7d6768c85acd86..0000000000000000000000000000000000000000 |
--- a/cc/resources/task_graph_runner.h |
+++ /dev/null |
@@ -1,232 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#ifndef CC_RESOURCES_TASK_GRAPH_RUNNER_H_ |
-#define CC_RESOURCES_TASK_GRAPH_RUNNER_H_ |
- |
-#include <map> |
-#include <vector> |
- |
-#include "base/logging.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/synchronization/condition_variable.h" |
-#include "cc/base/cc_export.h" |
- |
-namespace cc { |
- |
-class CC_EXPORT Task : public base::RefCountedThreadSafe<Task> { |
- public: |
- typedef std::vector<scoped_refptr<Task>> Vector; |
- |
- virtual void RunOnWorkerThread() = 0; |
- |
- void WillRun(); |
- void DidRun(); |
- bool HasFinishedRunning() const; |
- |
- protected: |
- friend class base::RefCountedThreadSafe<Task>; |
- |
- Task(); |
- virtual ~Task(); |
- |
- bool will_run_; |
- bool did_run_; |
-}; |
- |
-// Dependencies are represented as edges in a task graph. Each graph node is |
-// assigned a priority and a run count that matches the number of dependencies. |
-// Priority range from 0 (most favorable scheduling) to UINT_MAX (least |
-// favorable). |
-struct CC_EXPORT TaskGraph { |
- struct Node { |
- class TaskComparator { |
- public: |
- explicit TaskComparator(const Task* task) : task_(task) {} |
- |
- bool operator()(const Node& node) const { return node.task == task_; } |
- |
- private: |
- const Task* task_; |
- }; |
- |
- typedef std::vector<Node> Vector; |
- |
- Node(Task* task, unsigned priority, size_t dependencies) |
- : task(task), priority(priority), dependencies(dependencies) {} |
- |
- Task* task; |
- unsigned priority; |
- size_t dependencies; |
- }; |
- |
- struct Edge { |
- typedef std::vector<Edge> Vector; |
- |
- Edge(const Task* task, Task* dependent) |
- : task(task), dependent(dependent) {} |
- |
- const Task* task; |
- Task* dependent; |
- }; |
- |
- TaskGraph(); |
- ~TaskGraph(); |
- |
- void Swap(TaskGraph* other); |
- void Reset(); |
- |
- Node::Vector nodes; |
- Edge::Vector edges; |
-}; |
- |
-class TaskGraphRunner; |
- |
-// Opaque identifier that defines a namespace of tasks. |
-class CC_EXPORT NamespaceToken { |
- public: |
- NamespaceToken() : id_(0) {} |
- ~NamespaceToken() {} |
- |
- bool IsValid() const { return id_ != 0; } |
- |
- private: |
- friend class TaskGraphRunner; |
- |
- explicit NamespaceToken(int id) : id_(id) {} |
- |
- int id_; |
-}; |
- |
-// A TaskGraphRunner is used to process tasks with dependencies. There can |
-// be any number of TaskGraphRunner instances per thread. Tasks can be scheduled |
-// from any thread and they can be run on any thread. |
-class CC_EXPORT TaskGraphRunner { |
- public: |
- TaskGraphRunner(); |
- virtual ~TaskGraphRunner(); |
- |
- // Returns a unique token that can be used to pass a task graph to |
- // ScheduleTasks(). Valid tokens are always nonzero. |
- NamespaceToken GetNamespaceToken(); |
- |
- // Schedule running of tasks in |graph|. Tasks previously scheduled but no |
- // longer needed will be canceled unless already running. Canceled tasks are |
- // moved to |completed_tasks| without being run. The result is that once |
- // scheduled, a task is guaranteed to end up in the |completed_tasks| queue |
- // even if it later gets canceled by another call to ScheduleTasks(). |
- void ScheduleTasks(NamespaceToken token, TaskGraph* graph); |
- |
- // Wait for all scheduled tasks to finish running. |
- void WaitForTasksToFinishRunning(NamespaceToken token); |
- |
- // Collect all completed tasks in |completed_tasks|. |
- void CollectCompletedTasks(NamespaceToken token, |
- Task::Vector* completed_tasks); |
- |
- // Run tasks until Shutdown() is called. |
- void Run(); |
- |
- // Process all pending tasks, but don't wait/sleep. Return as soon as all |
- // tasks that can be run are taken care of. |
- void RunUntilIdle(); |
- |
- // Signals the Run method to return when it becomes idle. It will continue to |
- // process tasks and future tasks as long as they are scheduled. |
- // Warning: if the TaskGraphRunner remains busy, it may never quit. |
- void Shutdown(); |
- |
- private: |
- struct PrioritizedTask { |
- typedef std::vector<PrioritizedTask> Vector; |
- |
- PrioritizedTask(Task* task, unsigned priority) |
- : task(task), priority(priority) {} |
- |
- Task* task; |
- unsigned priority; |
- }; |
- |
- typedef std::vector<const Task*> TaskVector; |
- |
- struct TaskNamespace { |
- typedef std::vector<TaskNamespace*> Vector; |
- |
- TaskNamespace(); |
- ~TaskNamespace(); |
- |
- // Current task graph. |
- TaskGraph graph; |
- |
- // Ordered set of tasks that are ready to run. |
- PrioritizedTask::Vector ready_to_run_tasks; |
- |
- // Completed tasks not yet collected by origin thread. |
- Task::Vector completed_tasks; |
- |
- // This set contains all currently running tasks. |
- TaskVector running_tasks; |
- }; |
- |
- typedef std::map<int, TaskNamespace> TaskNamespaceMap; |
- |
- static bool CompareTaskPriority(const PrioritizedTask& a, |
- const PrioritizedTask& b) { |
- // In this system, numerically lower priority is run first. |
- return a.priority > b.priority; |
- } |
- |
- static bool CompareTaskNamespacePriority(const TaskNamespace* a, |
- const TaskNamespace* b) { |
- DCHECK(!a->ready_to_run_tasks.empty()); |
- DCHECK(!b->ready_to_run_tasks.empty()); |
- |
- // Compare based on task priority of the ready_to_run_tasks heap .front() |
- // will hold the max element of the heap, except after pop_heap, when max |
- // element is moved to .back(). |
- return CompareTaskPriority(a->ready_to_run_tasks.front(), |
- b->ready_to_run_tasks.front()); |
- } |
- |
- static bool HasFinishedRunningTasksInNamespace( |
- const TaskNamespace* task_namespace) { |
- return task_namespace->running_tasks.empty() && |
- task_namespace->ready_to_run_tasks.empty(); |
- } |
- |
- // Run next task. Caller must acquire |lock_| prior to calling this function |
- // and make sure at least one task is ready to run. |
- void RunTaskWithLockAcquired(); |
- |
- // This lock protects all members of this class. Do not read or modify |
- // anything without holding this lock. Do not block while holding this lock. |
- mutable base::Lock lock_; |
- |
- // Condition variable that is waited on by Run() until new tasks are ready to |
- // run or shutdown starts. |
- base::ConditionVariable has_ready_to_run_tasks_cv_; |
- |
- // Condition variable that is waited on by origin threads until a namespace |
- // has finished running all associated tasks. |
- base::ConditionVariable has_namespaces_with_finished_running_tasks_cv_; |
- |
- // Provides a unique id to each NamespaceToken. |
- int next_namespace_id_; |
- |
- // This set contains all namespaces with pending, running or completed tasks |
- // not yet collected. |
- TaskNamespaceMap namespaces_; |
- |
- // Ordered set of task namespaces that have ready to run tasks. |
- TaskNamespace::Vector ready_to_run_namespaces_; |
- |
- // Set during shutdown. Tells Run() to return when no more tasks are pending. |
- bool shutdown_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TaskGraphRunner); |
-}; |
- |
-} // namespace cc |
- |
-#endif // CC_RESOURCES_TASK_GRAPH_RUNNER_H_ |