| // Copyright 2015 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_RASTER_SINGLE_THREAD_TASK_GRAPH_RUNNER_H_ |
| #define CC_RASTER_SINGLE_THREAD_TASK_GRAPH_RUNNER_H_ |
| |
| #include <memory> |
| |
| #include "base/synchronization/condition_variable.h" |
| #include "base/threading/simple_thread.h" |
| #include "cc/raster/task_graph_runner.h" |
| #include "cc/raster/task_graph_work_queue.h" |
| |
| namespace base { |
| class SimpleThread; |
| } |
| |
| namespace cc { |
| |
| // Runs TaskGraphs asynchronously using a single worker thread. |
| class CC_EXPORT SingleThreadTaskGraphRunner |
| : public TaskGraphRunner, |
| public base::DelegateSimpleThread::Delegate { |
| public: |
| SingleThreadTaskGraphRunner(); |
| ~SingleThreadTaskGraphRunner() override; |
| |
| // Overridden from TaskGraphRunner: |
| NamespaceToken GenerateNamespaceToken() override; |
| void ScheduleTasks(NamespaceToken token, TaskGraph* graph) override; |
| void WaitForTasksToFinishRunning(NamespaceToken token) override; |
| void CollectCompletedTasks(NamespaceToken token, |
| Task::Vector* completed_tasks) override; |
| |
| // Overridden from base::DelegateSimpleThread::Delegate: |
| void Run() override; |
| |
| void Start(const std::string& thread_name, |
| const base::SimpleThread::Options& thread_options); |
| void Shutdown(); |
| |
| private: |
| // Returns true if there was a task to run. |
| bool RunTaskWithLockAcquired(); |
| |
| std::unique_ptr<base::SimpleThread> thread_; |
| |
| // Lock to exclusively access all the following members that are used to |
| // implement the TaskRunner interfaces. |
| base::Lock lock_; |
| |
| // Stores the actual tasks to be run by this runner, sorted by priority. |
| TaskGraphWorkQueue work_queue_; |
| |
| // 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_; |
| |
| // Set during shutdown. Tells Run() to return when no more tasks are pending. |
| bool shutdown_; |
| }; |
| |
| } // namespace cc |
| |
| #endif // CC_RASTER_SINGLE_THREAD_TASK_GRAPH_RUNNER_H_ |