blob: 79eba82abc688c0104f7da526e3af9947e520a95 [file] [log] [blame]
ericrk4e3aa5a2015-12-01 03:53:561// Copyright 2015 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CC_RASTER_SINGLE_THREAD_TASK_GRAPH_RUNNER_H_
6#define CC_RASTER_SINGLE_THREAD_TASK_GRAPH_RUNNER_H_
7
danakj60bc3bc2016-04-09 00:24:488#include <memory>
Benoit Lizec3fca2f92020-09-18 17:56:009#include <string>
danakj60bc3bc2016-04-09 00:24:4810
ericrk4e3aa5a2015-12-01 03:53:5611#include "base/synchronization/condition_variable.h"
Benoit Lizec3fca2f92020-09-18 17:56:0012#include "base/thread_annotations.h"
ericrk4e3aa5a2015-12-01 03:53:5613#include "base/threading/simple_thread.h"
14#include "cc/raster/task_graph_runner.h"
15#include "cc/raster/task_graph_work_queue.h"
16
17namespace base {
18class SimpleThread;
19}
20
21namespace cc {
22
23// Runs TaskGraphs asynchronously using a single worker thread.
24class CC_EXPORT SingleThreadTaskGraphRunner
25 : public TaskGraphRunner,
26 public base::DelegateSimpleThread::Delegate {
27 public:
28 SingleThreadTaskGraphRunner();
29 ~SingleThreadTaskGraphRunner() override;
30
31 // Overridden from TaskGraphRunner:
vmpstrcfd24082016-10-20 22:33:5132 NamespaceToken GenerateNamespaceToken() override;
ericrk4e3aa5a2015-12-01 03:53:5633 void ScheduleTasks(NamespaceToken token, TaskGraph* graph) override;
34 void WaitForTasksToFinishRunning(NamespaceToken token) override;
35 void CollectCompletedTasks(NamespaceToken token,
36 Task::Vector* completed_tasks) override;
37
38 // Overridden from base::DelegateSimpleThread::Delegate:
39 void Run() override;
40
41 void Start(const std::string& thread_name,
42 const base::SimpleThread::Options& thread_options);
43 void Shutdown();
44
45 private:
ericrk5a1188c62015-12-18 22:04:0446 // Returns true if there was a task to run.
Benoit Lizec3fca2f92020-09-18 17:56:0047 bool RunTaskWithLockAcquired() EXCLUSIVE_LOCKS_REQUIRED(lock_);
ericrk4e3aa5a2015-12-01 03:53:5648
danakj60bc3bc2016-04-09 00:24:4849 std::unique_ptr<base::SimpleThread> thread_;
ericrk4e3aa5a2015-12-01 03:53:5650
51 // Lock to exclusively access all the following members that are used to
52 // implement the TaskRunner interfaces.
53 base::Lock lock_;
54
55 // Stores the actual tasks to be run by this runner, sorted by priority.
Benoit Lizec3fca2f92020-09-18 17:56:0056 TaskGraphWorkQueue work_queue_ GUARDED_BY(lock_);
ericrk4e3aa5a2015-12-01 03:53:5657
58 // Condition variable that is waited on by Run() until new tasks are ready to
59 // run or shutdown starts.
60 base::ConditionVariable has_ready_to_run_tasks_cv_;
61
62 // Condition variable that is waited on by origin threads until a namespace
63 // has finished running all associated tasks.
64 base::ConditionVariable has_namespaces_with_finished_running_tasks_cv_;
65
66 // Set during shutdown. Tells Run() to return when no more tasks are pending.
Benoit Lizec3fca2f92020-09-18 17:56:0067 bool shutdown_ GUARDED_BY(lock_) = false;
ericrk4e3aa5a2015-12-01 03:53:5668};
69
70} // namespace cc
71
72#endif // CC_RASTER_SINGLE_THREAD_TASK_GRAPH_RUNNER_H_