OLD | NEW |
| (Empty) |
1 // Copyright 2013 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_BASE_BLOCKING_TASK_RUNNER_H_ | |
6 #define CC_BASE_BLOCKING_TASK_RUNNER_H_ | |
7 | |
8 #include <vector> | |
9 | |
10 #include "base/location.h" | |
11 #include "base/memory/scoped_ptr.h" | |
12 #include "base/single_thread_task_runner.h" | |
13 #include "base/synchronization/lock.h" | |
14 #include "base/threading/platform_thread.h" | |
15 | |
16 namespace cc { | |
17 | |
18 // This class wraps a SingleThreadTaskRunner but allows posted tasks to be | |
19 // run without a round trip through the message loop. This shortcutting | |
20 // removes guarantees about ordering. Tasks posted while the | |
21 // BlockingTaskRunner is in a capturing state will run in order, and tasks | |
22 // posted while the BlockingTaskRunner is /not/ in a capturing state will | |
23 // run in order, but the two sets of tasks will *not* run in order relative | |
24 // to when they were posted. | |
25 // | |
26 // To use this class, post tasks to the task runner returned by | |
27 // BlockingTaskRunner::Create(). The thread it is created on identifies the | |
28 // thread you want the tasks to run on. The SingleThreadTaskRunner which is | |
29 // passed into Create() is used to run tasks that are posted when not in a | |
30 // capturing state. | |
31 // | |
32 // Then, on the thread that the given task runner belongs to, you may | |
33 // instantiate a BlockingTaskRunner::CapturePostTasks. While this object | |
34 // exists, the task runner will collect any PostTasks called on it, posting | |
35 // tasks to that thread from anywhere. This CapturePostTasks object provides | |
36 // a window in time where tasks can shortcut past the MessageLoop. As soon | |
37 // as the CapturePostTasks object is destroyed (goes out of scope), all | |
38 // tasks that had been posted to the thread during the window will be executed | |
39 // immediately. | |
40 // | |
41 // Beware of re-entrancy, make sure the CapturePostTasks object is destroyed at | |
42 // a time when it makes sense for the embedder to call arbitrary things. | |
43 class BlockingTaskRunner { | |
44 public: | |
45 // Creates a BlockingTaskRunner for a given SingleThreadTaskRunner. | |
46 // |task_runner| will be used to run the tasks which are posted while we are | |
47 // not capturing. |task_runner| should belong to same the thread on which | |
48 // capturing is done. | |
49 static scoped_ptr<BlockingTaskRunner> Create( | |
50 scoped_refptr<base::SingleThreadTaskRunner> task_runner); | |
51 | |
52 ~BlockingTaskRunner(); | |
53 | |
54 // While an object of this type is held alive on a thread, any tasks | |
55 // posted to the thread will be captured and run as soon as the object | |
56 // is destroyed, shortcutting past the task runner. | |
57 class CapturePostTasks { | |
58 public: | |
59 explicit CapturePostTasks(BlockingTaskRunner* blocking_runner); | |
60 ~CapturePostTasks(); | |
61 | |
62 private: | |
63 BlockingTaskRunner* blocking_runner_; | |
64 | |
65 DISALLOW_COPY_AND_ASSIGN(CapturePostTasks); | |
66 }; | |
67 | |
68 // True if tasks posted to the BlockingTaskRunner will run on the current | |
69 // thread. | |
70 bool BelongsToCurrentThread(); | |
71 | |
72 // Posts a task using the contained SingleThreadTaskRunner unless |capture_| | |
73 // is true. When |capture_| is true, tasks posted will be caught and stored | |
74 // until the capturing stops. At that time the tasks will be run directly | |
75 // instead of being posted to the SingleThreadTaskRunner. | |
76 bool PostTask(const tracked_objects::Location& from_here, | |
77 const base::Closure& task); | |
78 | |
79 private: | |
80 explicit BlockingTaskRunner( | |
81 scoped_refptr<base::SingleThreadTaskRunner> task_runner); | |
82 | |
83 void SetCapture(bool capture); | |
84 | |
85 base::PlatformThreadId thread_id_; | |
86 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | |
87 | |
88 base::Lock lock_; | |
89 int capture_; | |
90 std::vector<base::Closure> captured_tasks_; | |
91 | |
92 DISALLOW_COPY_AND_ASSIGN(BlockingTaskRunner); | |
93 }; | |
94 | |
95 } // namespace cc | |
96 | |
97 #endif // CC_BASE_BLOCKING_TASK_RUNNER_H_ | |
OLD | NEW |