OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/threading/sequenced_worker_pool.h" | 5 #include "base/threading/sequenced_worker_pool.h" |
6 | 6 |
7 #include <list> | 7 #include <list> |
8 #include <map> | 8 #include <map> |
9 #include <set> | 9 #include <set> |
10 #include <utility> | 10 #include <utility> |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). | 55 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). |
56 class SequencedWorkerPoolTaskRunner : public TaskRunner { | 56 class SequencedWorkerPoolTaskRunner : public TaskRunner { |
57 public: | 57 public: |
58 SequencedWorkerPoolTaskRunner( | 58 SequencedWorkerPoolTaskRunner( |
59 const scoped_refptr<SequencedWorkerPool>& pool, | 59 const scoped_refptr<SequencedWorkerPool>& pool, |
60 SequencedWorkerPool::WorkerShutdown shutdown_behavior); | 60 SequencedWorkerPool::WorkerShutdown shutdown_behavior); |
61 | 61 |
62 // TaskRunner implementation | 62 // TaskRunner implementation |
63 virtual bool PostDelayedTask(const tracked_objects::Location& from_here, | 63 virtual bool PostDelayedTask(const tracked_objects::Location& from_here, |
64 const Closure& task, | 64 const Closure& task, |
65 int64 delay_ms) OVERRIDE; | |
66 virtual bool PostDelayedTask(const tracked_objects::Location& from_here, | |
67 const Closure& task, | |
68 TimeDelta delay) OVERRIDE; | 65 TimeDelta delay) OVERRIDE; |
69 virtual bool RunsTasksOnCurrentThread() const OVERRIDE; | 66 virtual bool RunsTasksOnCurrentThread() const OVERRIDE; |
70 | 67 |
71 private: | 68 private: |
72 virtual ~SequencedWorkerPoolTaskRunner(); | 69 virtual ~SequencedWorkerPoolTaskRunner(); |
73 | 70 |
74 // Helper function for posting a delayed task. Asserts that the delay is | 71 // Helper function for posting a delayed task. Asserts that the delay is |
75 // zero because non-zero delays are not yet supported. | 72 // zero because non-zero delays are not yet supported. |
76 bool PostDelayedTaskAssertZeroDelay( | 73 bool PostDelayedTaskAssertZeroDelay( |
77 const tracked_objects::Location& from_here, | 74 const tracked_objects::Location& from_here, |
78 const Closure& task, | 75 const Closure& task, |
79 int64 delay_ms); | |
80 bool PostDelayedTaskAssertZeroDelay( | |
81 const tracked_objects::Location& from_here, | |
82 const Closure& task, | |
83 TimeDelta delay); | 76 TimeDelta delay); |
84 | 77 |
85 const scoped_refptr<SequencedWorkerPool> pool_; | 78 const scoped_refptr<SequencedWorkerPool> pool_; |
86 | 79 |
87 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; | 80 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; |
88 | 81 |
89 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolTaskRunner); | 82 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolTaskRunner); |
90 }; | 83 }; |
91 | 84 |
92 SequencedWorkerPoolTaskRunner::SequencedWorkerPoolTaskRunner( | 85 SequencedWorkerPoolTaskRunner::SequencedWorkerPoolTaskRunner( |
93 const scoped_refptr<SequencedWorkerPool>& pool, | 86 const scoped_refptr<SequencedWorkerPool>& pool, |
94 SequencedWorkerPool::WorkerShutdown shutdown_behavior) | 87 SequencedWorkerPool::WorkerShutdown shutdown_behavior) |
95 : pool_(pool), | 88 : pool_(pool), |
96 shutdown_behavior_(shutdown_behavior) { | 89 shutdown_behavior_(shutdown_behavior) { |
97 } | 90 } |
98 | 91 |
99 SequencedWorkerPoolTaskRunner::~SequencedWorkerPoolTaskRunner() { | 92 SequencedWorkerPoolTaskRunner::~SequencedWorkerPoolTaskRunner() { |
100 } | 93 } |
101 | 94 |
102 bool SequencedWorkerPoolTaskRunner::PostDelayedTask( | 95 bool SequencedWorkerPoolTaskRunner::PostDelayedTask( |
103 const tracked_objects::Location& from_here, | 96 const tracked_objects::Location& from_here, |
104 const Closure& task, | 97 const Closure& task, |
105 int64 delay_ms) { | |
106 return PostDelayedTaskAssertZeroDelay(from_here, task, delay_ms); | |
107 } | |
108 | |
109 bool SequencedWorkerPoolTaskRunner::PostDelayedTask( | |
110 const tracked_objects::Location& from_here, | |
111 const Closure& task, | |
112 TimeDelta delay) { | 98 TimeDelta delay) { |
113 return PostDelayedTaskAssertZeroDelay(from_here, task, delay); | 99 return PostDelayedTaskAssertZeroDelay(from_here, task, delay); |
114 } | 100 } |
115 | 101 |
116 bool SequencedWorkerPoolTaskRunner::RunsTasksOnCurrentThread() const { | 102 bool SequencedWorkerPoolTaskRunner::RunsTasksOnCurrentThread() const { |
117 return pool_->RunsTasksOnCurrentThread(); | 103 return pool_->RunsTasksOnCurrentThread(); |
118 } | 104 } |
119 | 105 |
120 bool SequencedWorkerPoolTaskRunner::PostDelayedTaskAssertZeroDelay( | 106 bool SequencedWorkerPoolTaskRunner::PostDelayedTaskAssertZeroDelay( |
121 const tracked_objects::Location& from_here, | 107 const tracked_objects::Location& from_here, |
122 const Closure& task, | 108 const Closure& task, |
123 int64 delay_ms) { | 109 TimeDelta delay) { |
124 // TODO(francoisk777@gmail.com): Change the following two statements once | 110 // TODO(francoisk777@gmail.com): Change the following two statements once |
125 // SequencedWorkerPool supports non-zero delays. | 111 // SequencedWorkerPool supports non-zero delays. |
126 DCHECK_EQ(delay_ms, 0) | 112 DCHECK_EQ(delay.InMillisecondsRoundedUp(), 0) |
127 << "SequencedWorkerPoolTaskRunner does not yet support non-zero delays"; | 113 << "SequencedWorkerPoolTaskRunner does not yet support non-zero delays"; |
128 return pool_->PostWorkerTaskWithShutdownBehavior( | 114 return pool_->PostWorkerTaskWithShutdownBehavior( |
129 from_here, task, shutdown_behavior_); | 115 from_here, task, shutdown_behavior_); |
130 } | 116 } |
131 | 117 |
132 bool SequencedWorkerPoolTaskRunner::PostDelayedTaskAssertZeroDelay( | |
133 const tracked_objects::Location& from_here, | |
134 const Closure& task, | |
135 TimeDelta delay) { | |
136 return PostDelayedTaskAssertZeroDelay(from_here, | |
137 task, | |
138 delay.InMillisecondsRoundedUp()); | |
139 } | |
140 | |
141 // SequencedWorkerPoolSequencedTaskRunner ------------------------------------ | 118 // SequencedWorkerPoolSequencedTaskRunner ------------------------------------ |
142 // A SequencedTaskRunner which posts tasks to a SequencedWorkerPool with a | 119 // A SequencedTaskRunner which posts tasks to a SequencedWorkerPool with a |
143 // fixed sequence token. | 120 // fixed sequence token. |
144 // | 121 // |
145 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). | 122 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). |
146 class SequencedWorkerPoolSequencedTaskRunner : public SequencedTaskRunner { | 123 class SequencedWorkerPoolSequencedTaskRunner : public SequencedTaskRunner { |
147 public: | 124 public: |
148 SequencedWorkerPoolSequencedTaskRunner( | 125 SequencedWorkerPoolSequencedTaskRunner( |
149 const scoped_refptr<SequencedWorkerPool>& pool, | 126 const scoped_refptr<SequencedWorkerPool>& pool, |
150 SequencedWorkerPool::SequenceToken token, | 127 SequencedWorkerPool::SequenceToken token, |
151 SequencedWorkerPool::WorkerShutdown shutdown_behavior); | 128 SequencedWorkerPool::WorkerShutdown shutdown_behavior); |
152 | 129 |
153 // TaskRunner implementation | 130 // TaskRunner implementation |
154 virtual bool PostDelayedTask(const tracked_objects::Location& from_here, | 131 virtual bool PostDelayedTask(const tracked_objects::Location& from_here, |
155 const Closure& task, | 132 const Closure& task, |
156 int64 delay_ms) OVERRIDE; | |
157 virtual bool PostDelayedTask(const tracked_objects::Location& from_here, | |
158 const Closure& task, | |
159 TimeDelta delay) OVERRIDE; | 133 TimeDelta delay) OVERRIDE; |
160 virtual bool RunsTasksOnCurrentThread() const OVERRIDE; | 134 virtual bool RunsTasksOnCurrentThread() const OVERRIDE; |
161 | 135 |
162 // SequencedTaskRunner implementation | 136 // SequencedTaskRunner implementation |
163 virtual bool PostNonNestableDelayedTask( | 137 virtual bool PostNonNestableDelayedTask( |
164 const tracked_objects::Location& from_here, | 138 const tracked_objects::Location& from_here, |
165 const Closure& task, | 139 const Closure& task, |
166 int64 delay_ms) OVERRIDE; | |
167 virtual bool PostNonNestableDelayedTask( | |
168 const tracked_objects::Location& from_here, | |
169 const Closure& task, | |
170 TimeDelta delay) OVERRIDE; | 140 TimeDelta delay) OVERRIDE; |
171 | 141 |
172 private: | 142 private: |
173 virtual ~SequencedWorkerPoolSequencedTaskRunner(); | 143 virtual ~SequencedWorkerPoolSequencedTaskRunner(); |
174 | 144 |
175 // Helper function for posting a delayed task. Asserts that the delay is | 145 // Helper function for posting a delayed task. Asserts that the delay is |
176 // zero because non-zero delays are not yet supported. | 146 // zero because non-zero delays are not yet supported. |
177 bool PostDelayedTaskAssertZeroDelay( | 147 bool PostDelayedTaskAssertZeroDelay( |
178 const tracked_objects::Location& from_here, | 148 const tracked_objects::Location& from_here, |
179 const Closure& task, | 149 const Closure& task, |
180 int64 delay_ms); | |
181 bool PostDelayedTaskAssertZeroDelay( | |
182 const tracked_objects::Location& from_here, | |
183 const Closure& task, | |
184 TimeDelta delay); | 150 TimeDelta delay); |
185 | 151 |
186 const scoped_refptr<SequencedWorkerPool> pool_; | 152 const scoped_refptr<SequencedWorkerPool> pool_; |
187 | 153 |
188 const SequencedWorkerPool::SequenceToken token_; | 154 const SequencedWorkerPool::SequenceToken token_; |
189 | 155 |
190 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; | 156 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; |
191 | 157 |
192 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolSequencedTaskRunner); | 158 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolSequencedTaskRunner); |
193 }; | 159 }; |
194 | 160 |
195 SequencedWorkerPoolSequencedTaskRunner::SequencedWorkerPoolSequencedTaskRunner( | 161 SequencedWorkerPoolSequencedTaskRunner::SequencedWorkerPoolSequencedTaskRunner( |
196 const scoped_refptr<SequencedWorkerPool>& pool, | 162 const scoped_refptr<SequencedWorkerPool>& pool, |
197 SequencedWorkerPool::SequenceToken token, | 163 SequencedWorkerPool::SequenceToken token, |
198 SequencedWorkerPool::WorkerShutdown shutdown_behavior) | 164 SequencedWorkerPool::WorkerShutdown shutdown_behavior) |
199 : pool_(pool), | 165 : pool_(pool), |
200 token_(token), | 166 token_(token), |
201 shutdown_behavior_(shutdown_behavior) { | 167 shutdown_behavior_(shutdown_behavior) { |
202 } | 168 } |
203 | 169 |
204 SequencedWorkerPoolSequencedTaskRunner:: | 170 SequencedWorkerPoolSequencedTaskRunner:: |
205 ~SequencedWorkerPoolSequencedTaskRunner() { | 171 ~SequencedWorkerPoolSequencedTaskRunner() { |
206 } | 172 } |
207 | 173 |
208 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTask( | 174 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTask( |
209 const tracked_objects::Location& from_here, | 175 const tracked_objects::Location& from_here, |
210 const Closure& task, | 176 const Closure& task, |
211 int64 delay_ms) { | |
212 return PostDelayedTaskAssertZeroDelay(from_here, task, delay_ms); | |
213 } | |
214 | |
215 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTask( | |
216 const tracked_objects::Location& from_here, | |
217 const Closure& task, | |
218 TimeDelta delay) { | 177 TimeDelta delay) { |
219 return PostDelayedTaskAssertZeroDelay(from_here, task, delay); | 178 return PostDelayedTaskAssertZeroDelay(from_here, task, delay); |
220 } | 179 } |
221 | 180 |
222 bool SequencedWorkerPoolSequencedTaskRunner::RunsTasksOnCurrentThread() const { | 181 bool SequencedWorkerPoolSequencedTaskRunner::RunsTasksOnCurrentThread() const { |
223 return pool_->IsRunningSequenceOnCurrentThread(token_); | 182 return pool_->IsRunningSequenceOnCurrentThread(token_); |
224 } | 183 } |
225 | 184 |
226 bool SequencedWorkerPoolSequencedTaskRunner::PostNonNestableDelayedTask( | 185 bool SequencedWorkerPoolSequencedTaskRunner::PostNonNestableDelayedTask( |
227 const tracked_objects::Location& from_here, | 186 const tracked_objects::Location& from_here, |
228 const Closure& task, | 187 const Closure& task, |
229 int64 delay_ms) { | |
230 return PostDelayedTaskAssertZeroDelay(from_here, task, delay_ms); | |
231 } | |
232 | |
233 bool SequencedWorkerPoolSequencedTaskRunner::PostNonNestableDelayedTask( | |
234 const tracked_objects::Location& from_here, | |
235 const Closure& task, | |
236 TimeDelta delay) { | 188 TimeDelta delay) { |
237 return PostDelayedTaskAssertZeroDelay(from_here, task, delay); | 189 return PostDelayedTaskAssertZeroDelay(from_here, task, delay); |
238 } | 190 } |
239 | 191 |
240 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTaskAssertZeroDelay( | 192 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTaskAssertZeroDelay( |
241 const tracked_objects::Location& from_here, | 193 const tracked_objects::Location& from_here, |
242 const Closure& task, | 194 const Closure& task, |
243 int64 delay_ms) { | 195 TimeDelta delay) { |
244 // TODO(francoisk777@gmail.com): Change the following two statements once | 196 // TODO(francoisk777@gmail.com): Change the following two statements once |
245 // SequencedWorkerPool supports non-zero delays. | 197 // SequencedWorkerPool supports non-zero delays. |
246 DCHECK_EQ(delay_ms, 0) | 198 DCHECK_EQ(delay.InMillisecondsRoundedUp(), 0) |
247 << "SequencedWorkerPoolSequencedTaskRunner does not yet support non-zero" | 199 << "SequencedWorkerPoolSequencedTaskRunner does not yet support non-zero" |
248 " delays"; | 200 " delays"; |
249 return pool_->PostSequencedWorkerTaskWithShutdownBehavior( | 201 return pool_->PostSequencedWorkerTaskWithShutdownBehavior( |
250 token_, from_here, task, shutdown_behavior_); | 202 token_, from_here, task, shutdown_behavior_); |
251 } | 203 } |
252 | 204 |
253 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTaskAssertZeroDelay( | |
254 const tracked_objects::Location& from_here, | |
255 const Closure& task, | |
256 TimeDelta delay) { | |
257 return PostDelayedTaskAssertZeroDelay(from_here, | |
258 task, | |
259 delay.InMillisecondsRoundedUp()); | |
260 } | |
261 | |
262 } // namespace | 205 } // namespace |
263 | 206 |
264 // Worker --------------------------------------------------------------------- | 207 // Worker --------------------------------------------------------------------- |
265 | 208 |
266 class SequencedWorkerPool::Worker : public SimpleThread { | 209 class SequencedWorkerPool::Worker : public SimpleThread { |
267 public: | 210 public: |
268 // Hold a (cyclic) ref to |worker_pool|, since we want to keep it | 211 // Hold a (cyclic) ref to |worker_pool|, since we want to keep it |
269 // around as long as we are running. | 212 // around as long as we are running. |
270 Worker(const scoped_refptr<SequencedWorkerPool>& worker_pool, | 213 Worker(const scoped_refptr<SequencedWorkerPool>& worker_pool, |
271 int thread_number, | 214 int thread_number, |
(...skipping 754 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1026 const tracked_objects::Location& from_here, | 969 const tracked_objects::Location& from_here, |
1027 const Closure& task, | 970 const Closure& task, |
1028 WorkerShutdown shutdown_behavior) { | 971 WorkerShutdown shutdown_behavior) { |
1029 return inner_->PostTask(NULL, sequence_token, shutdown_behavior, | 972 return inner_->PostTask(NULL, sequence_token, shutdown_behavior, |
1030 from_here, task); | 973 from_here, task); |
1031 } | 974 } |
1032 | 975 |
1033 bool SequencedWorkerPool::PostDelayedTask( | 976 bool SequencedWorkerPool::PostDelayedTask( |
1034 const tracked_objects::Location& from_here, | 977 const tracked_objects::Location& from_here, |
1035 const Closure& task, | 978 const Closure& task, |
1036 int64 delay_ms) { | |
1037 // TODO(akalin): Add support for non-zero delays. | |
1038 DCHECK_EQ(delay_ms, 0); | |
1039 return PostWorkerTask(from_here, task); | |
1040 } | |
1041 | |
1042 bool SequencedWorkerPool::PostDelayedTask( | |
1043 const tracked_objects::Location& from_here, | |
1044 const Closure& task, | |
1045 TimeDelta delay) { | 979 TimeDelta delay) { |
1046 // TODO(akalin): Add support for non-zero delays. | 980 // TODO(akalin): Add support for non-zero delays. |
1047 DCHECK_EQ(delay.InMillisecondsRoundedUp(), 0); | 981 DCHECK_EQ(delay.InMillisecondsRoundedUp(), 0); |
1048 return PostWorkerTask(from_here, task); | 982 return PostWorkerTask(from_here, task); |
1049 } | 983 } |
1050 | 984 |
1051 bool SequencedWorkerPool::RunsTasksOnCurrentThread() const { | 985 bool SequencedWorkerPool::RunsTasksOnCurrentThread() const { |
1052 return inner_->RunsTasksOnCurrentThread(); | 986 return inner_->RunsTasksOnCurrentThread(); |
1053 } | 987 } |
1054 | 988 |
1055 bool SequencedWorkerPool::IsRunningSequenceOnCurrentThread( | 989 bool SequencedWorkerPool::IsRunningSequenceOnCurrentThread( |
1056 SequenceToken sequence_token) const { | 990 SequenceToken sequence_token) const { |
1057 return inner_->IsRunningSequenceOnCurrentThread(sequence_token); | 991 return inner_->IsRunningSequenceOnCurrentThread(sequence_token); |
1058 } | 992 } |
1059 | 993 |
1060 void SequencedWorkerPool::FlushForTesting() { | 994 void SequencedWorkerPool::FlushForTesting() { |
1061 inner_->FlushForTesting(); | 995 inner_->FlushForTesting(); |
1062 } | 996 } |
1063 | 997 |
1064 void SequencedWorkerPool::SignalHasWorkForTesting() { | 998 void SequencedWorkerPool::SignalHasWorkForTesting() { |
1065 inner_->SignalHasWorkForTesting(); | 999 inner_->SignalHasWorkForTesting(); |
1066 } | 1000 } |
1067 | 1001 |
1068 void SequencedWorkerPool::Shutdown() { | 1002 void SequencedWorkerPool::Shutdown() { |
1069 DCHECK(constructor_message_loop_->BelongsToCurrentThread()); | 1003 DCHECK(constructor_message_loop_->BelongsToCurrentThread()); |
1070 inner_->Shutdown(); | 1004 inner_->Shutdown(); |
1071 } | 1005 } |
1072 | 1006 |
1073 } // namespace base | 1007 } // namespace base |
OLD | NEW |