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
3 // found in the LICENSE file.
5 #ifndef CONTENT_RENDERER_RASTER_WORKER_POOL_H_
6 #define CONTENT_RENDERER_RASTER_WORKER_POOL_H_
8 #include "base/callback.h"
9 #include "base/containers/hash_tables.h"
10 #include "base/memory/scoped_vector.h"
11 #include "base/sequenced_task_runner.h"
12 #include "base/task_runner.h"
13 #include "base/threading/simple_thread.h"
14 #include "cc/raster/task_graph_runner.h"
15 #include "content/common/content_export.h"
19 // A pool of threads used to run raster work.
20 // Work can be scheduled on the threads using different interfaces.
21 // The pool itself implements TaskRunner interface and tasks posted via that
22 // interface might run in parallel.
23 // CreateSequencedTaskRunner creates a sequenced task runner that might run in
24 // parallel with other instances of sequenced task runners.
25 // It's also possible to get the underlying TaskGraphRunner to schedule a graph
26 // of tasks with their dependencies.
27 // TODO(reveman): make TaskGraphRunner an abstract interface and have this
28 // WorkerPool class implement it.
29 class CONTENT_EXPORT RasterWorkerPool
30 : public base::TaskRunner
,
31 public base::DelegateSimpleThread::Delegate
{
35 // Overridden from base::TaskRunner:
36 bool PostDelayedTask(const tracked_objects::Location
& from_here
,
37 const base::Closure
& task
,
38 base::TimeDelta delay
) override
;
39 bool RunsTasksOnCurrentThread() const override
;
41 // Overridden from base::DelegateSimpleThread::Delegate:
44 // Spawn |num_threads| number of threads and start running work on the
46 void Start(int num_threads
,
47 const base::SimpleThread::Options
& thread_options
);
49 // Finish running all the posted tasks (and nested task posted by those tasks)
50 // of all the associated task runners.
51 // Once all the tasks are executed the method blocks until the threads are
55 cc::TaskGraphRunner
* GetTaskGraphRunner() { return &task_graph_runner_
; }
57 // Create a new sequenced task graph runner.
58 scoped_refptr
<base::SequencedTaskRunner
> CreateSequencedTaskRunner();
61 ~RasterWorkerPool() override
;
64 class RasterWorkerPoolSequencedTaskRunner
;
65 friend class RasterWorkerPoolSequencedTaskRunner
;
67 // Simple Task for the TaskGraphRunner that wraps a closure.
68 // This class is used to schedule TaskRunner tasks on the
69 // |task_graph_runner_|.
70 class ClosureTask
: public cc::Task
{
72 explicit ClosureTask(const base::Closure
& closure
);
74 // Overridden from cc::Task:
75 void RunOnWorkerThread() override
;
78 ~ClosureTask() override
;
81 base::Closure closure_
;
83 DISALLOW_COPY_AND_ASSIGN(ClosureTask
);
86 // The actual threads where work is done.
87 ScopedVector
<base::DelegateSimpleThread
> threads_
;
88 cc::TaskGraphRunner task_graph_runner_
;
90 // Lock to exclusively access all the following members that are used to
91 // implement the TaskRunner interfaces.
93 // Namespace used to schedule tasks in the task graph runner.
94 cc::NamespaceToken namespace_token_
;
95 // List of tasks currently queued up for execution.
96 cc::Task::Vector tasks_
;
97 // Graph object used for scheduling tasks.
99 // Cached vector to avoid allocation when getting the list of complete
101 cc::Task::Vector completed_tasks_
;
104 } // namespace content
106 #endif // CONTENT_RENDERER_RASTER_WORKER_POOL_H_