| 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 100755
|
| index 6915c5bb2785cc36c2db2f88aa40e76e1ecde94a..0000000000000000000000000000000000000000
|
| --- a/cc/resources/task_graph_runner.h
|
| +++ /dev/null
|
| @@ -1,235 +0,0 @@
|
| -// Copyright 2013 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 <queue>
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/containers/scoped_ptr_hash_map.h"
|
| -#include "base/memory/ref_counted.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/synchronization/condition_variable.h"
|
| -#include "base/threading/simple_thread.h"
|
| -#include "cc/base/cc_export.h"
|
| -#include "cc/base/scoped_ptr_deque.h"
|
| -
|
| -namespace cc {
|
| -namespace internal {
|
| -
|
| -class CC_EXPORT Task : public base::RefCountedThreadSafe<Task> {
|
| - public:
|
| - typedef std::vector<scoped_refptr<Task> > Vector;
|
| -
|
| - virtual void RunOnWorkerThread(unsigned thread_index) = 0;
|
| -
|
| - void DidSchedule();
|
| - void WillRun();
|
| - void DidRun();
|
| -
|
| - bool HasFinishedRunning() const;
|
| -
|
| - protected:
|
| - friend class base::RefCountedThreadSafe<Task>;
|
| -
|
| - Task();
|
| - virtual ~Task();
|
| -
|
| - bool did_schedule_;
|
| - bool did_run_;
|
| -};
|
| -
|
| -} // namespace internal
|
| -} // namespace cc
|
| -
|
| -#if defined(COMPILER_GCC)
|
| -namespace BASE_HASH_NAMESPACE {
|
| -template <> struct hash<cc::internal::Task*> {
|
| - size_t operator()(cc::internal::Task* ptr) const {
|
| - return hash<size_t>()(reinterpret_cast<size_t>(ptr));
|
| - }
|
| -};
|
| -} // namespace BASE_HASH_NAMESPACE
|
| -#endif // COMPILER
|
| -
|
| -namespace cc {
|
| -namespace internal {
|
| -
|
| -// Dependencies are represented by edges in a task graph. A graph node
|
| -// store edges as a vector of dependents. Each graph node is assigned
|
| -// a priority and a run count that matches the number of dependencies.
|
| -class CC_EXPORT GraphNode {
|
| - public:
|
| - typedef std::vector<GraphNode*> Vector;
|
| - typedef base::ScopedPtrHashMap<Task*, GraphNode> Map;
|
| -
|
| - GraphNode(Task* task, unsigned priority);
|
| - ~GraphNode();
|
| -
|
| - Task* task() { return task_; }
|
| -
|
| - void add_dependent(GraphNode* dependent) {
|
| - DCHECK(dependent);
|
| - dependents_.push_back(dependent);
|
| - }
|
| - const Vector& dependents() const { return dependents_; }
|
| -
|
| - unsigned priority() const { return priority_; }
|
| -
|
| - unsigned num_dependencies() const { return num_dependencies_; }
|
| - void add_dependency() { ++num_dependencies_; }
|
| - void remove_dependency() {
|
| - DCHECK(num_dependencies_);
|
| - --num_dependencies_;
|
| - }
|
| -
|
| - private:
|
| - Task* task_;
|
| - Vector dependents_;
|
| - unsigned priority_;
|
| - unsigned num_dependencies_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(GraphNode);
|
| -};
|
| -
|
| -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 worker thread pool that runs tasks provided by task graph. Destructor
|
| -// might block and should not be used on a thread that needs to be responsive.
|
| -class CC_EXPORT TaskGraphRunner : public base::DelegateSimpleThread::Delegate {
|
| - public:
|
| - typedef GraphNode::Map TaskGraph;
|
| -
|
| - TaskGraphRunner(size_t num_threads, const std::string& thread_name_prefix);
|
| - virtual ~TaskGraphRunner();
|
| -
|
| - // Returns a unique token that can be used to pass a task graph to
|
| - // SetTaskGraph(). 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 get canceled by another
|
| - // call to SetTaskGraph().
|
| - void SetTaskGraph(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);
|
| -
|
| - private:
|
| - struct TaskNamespace {
|
| - typedef std::vector<TaskNamespace*> Vector;
|
| -
|
| - TaskNamespace();
|
| - ~TaskNamespace();
|
| -
|
| - // This set contains all pending tasks.
|
| - TaskGraph pending_tasks;
|
| - // This set contains all currently running tasks.
|
| - TaskGraph running_tasks;
|
| - // Completed tasks not yet collected by origin thread.
|
| - Task::Vector completed_tasks;
|
| - // Ordered set of tasks that are ready to run.
|
| - internal::GraphNode::Vector ready_to_run_tasks;
|
| - };
|
| -
|
| - typedef base::ScopedPtrHashMap<int, TaskNamespace> TaskNamespaceMap;
|
| -
|
| - static bool CompareTaskPriority(const internal::GraphNode* a,
|
| - const internal::GraphNode* b) {
|
| - // In this system, numerically lower priority is run first.
|
| - if (a->priority() != b->priority())
|
| - return a->priority() > b->priority();
|
| -
|
| - // Run task with most dependents first when priority is the same.
|
| - return a->dependents().size() < b->dependents().size();
|
| - }
|
| -
|
| - 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(
|
| - TaskNamespace* task_namespace) {
|
| - return task_namespace->pending_tasks.empty() &&
|
| - task_namespace->running_tasks.empty();
|
| - }
|
| -
|
| - // Overridden from base::DelegateSimpleThread:
|
| - virtual void Run() OVERRIDE;
|
| -
|
| - // 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 worker threads 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_;
|
| -
|
| - // Provides each running thread loop with a unique index. First thread
|
| - // loop index is 0.
|
| - unsigned next_thread_index_;
|
| -
|
| - // Set during shutdown. Tells workers to exit when no more tasks
|
| - // are pending.
|
| - bool shutdown_;
|
| -
|
| - ScopedPtrDeque<base::DelegateSimpleThread> workers_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(TaskGraphRunner);
|
| -};
|
| -
|
| -} // namespace internal
|
| -} // namespace cc
|
| -
|
| -#endif // CC_RESOURCES_TASK_GRAPH_RUNNER_H_
|
|
|