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 <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <list> | 9 #include <list> |
10 #include <map> | 10 #include <map> |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 return true; | 110 return true; |
111 | 111 |
112 if (lhs.time_to_run > rhs.time_to_run) | 112 if (lhs.time_to_run > rhs.time_to_run) |
113 return false; | 113 return false; |
114 | 114 |
115 // If the time happen to match, then we use the sequence number to decide. | 115 // If the time happen to match, then we use the sequence number to decide. |
116 return lhs.sequence_task_number < rhs.sequence_task_number; | 116 return lhs.sequence_task_number < rhs.sequence_task_number; |
117 } | 117 } |
118 }; | 118 }; |
119 | 119 |
| 120 // Create a process-wide unique ID to represent this task in trace events. This |
| 121 // will be mangled with a Process ID hash to reduce the likelyhood of colliding |
| 122 // with MessageLoop pointers on other processes. |
| 123 uint64_t GetTaskTraceID(const SequencedTask& task, void* pool) { |
| 124 return (static_cast<uint64_t>(task.trace_id) << 32) | |
| 125 static_cast<uint64_t>(reinterpret_cast<intptr_t>(pool)); |
| 126 } |
| 127 |
120 // SequencedWorkerPoolTaskRunner --------------------------------------------- | 128 // SequencedWorkerPoolTaskRunner --------------------------------------------- |
121 // A TaskRunner which posts tasks to a SequencedWorkerPool with a | 129 // A TaskRunner which posts tasks to a SequencedWorkerPool with a |
122 // fixed ShutdownBehavior. | 130 // fixed ShutdownBehavior. |
123 // | 131 // |
124 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). | 132 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). |
125 class SequencedWorkerPoolTaskRunner : public TaskRunner { | 133 class SequencedWorkerPoolTaskRunner : public TaskRunner { |
126 public: | 134 public: |
127 SequencedWorkerPoolTaskRunner( | 135 SequencedWorkerPoolTaskRunner( |
128 scoped_refptr<SequencedWorkerPool> pool, | 136 scoped_refptr<SequencedWorkerPool> pool, |
129 SequencedWorkerPool::WorkerShutdown shutdown_behavior); | 137 SequencedWorkerPool::WorkerShutdown shutdown_behavior); |
(...skipping 30 matching lines...) Expand all Loading... |
160 return pool_->PostWorkerTaskWithShutdownBehavior( | 168 return pool_->PostWorkerTaskWithShutdownBehavior( |
161 from_here, task, shutdown_behavior_); | 169 from_here, task, shutdown_behavior_); |
162 } | 170 } |
163 return pool_->PostDelayedWorkerTask(from_here, task, delay); | 171 return pool_->PostDelayedWorkerTask(from_here, task, delay); |
164 } | 172 } |
165 | 173 |
166 bool SequencedWorkerPoolTaskRunner::RunsTasksOnCurrentThread() const { | 174 bool SequencedWorkerPoolTaskRunner::RunsTasksOnCurrentThread() const { |
167 return pool_->RunsTasksOnCurrentThread(); | 175 return pool_->RunsTasksOnCurrentThread(); |
168 } | 176 } |
169 | 177 |
170 // SequencedWorkerPoolSequencedTaskRunner ------------------------------------ | 178 } // namespace |
| 179 |
| 180 // SequencedWorkerPool::PoolSequencedTaskRunner ------------------------------ |
171 // A SequencedTaskRunner which posts tasks to a SequencedWorkerPool with a | 181 // A SequencedTaskRunner which posts tasks to a SequencedWorkerPool with a |
172 // fixed sequence token. | 182 // fixed sequence token. |
173 // | 183 // |
174 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). | 184 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). |
175 class SequencedWorkerPoolSequencedTaskRunner : public SequencedTaskRunner { | 185 class SequencedWorkerPool::PoolSequencedTaskRunner |
| 186 : public SequencedTaskRunner { |
176 public: | 187 public: |
177 SequencedWorkerPoolSequencedTaskRunner( | 188 PoolSequencedTaskRunner( |
178 scoped_refptr<SequencedWorkerPool> pool, | 189 scoped_refptr<SequencedWorkerPool> pool, |
179 SequencedWorkerPool::SequenceToken token, | 190 SequencedWorkerPool::SequenceToken token, |
180 SequencedWorkerPool::WorkerShutdown shutdown_behavior); | 191 SequencedWorkerPool::WorkerShutdown shutdown_behavior); |
181 | 192 |
182 // TaskRunner implementation | 193 // TaskRunner implementation |
183 bool PostDelayedTask(const tracked_objects::Location& from_here, | 194 bool PostDelayedTask(const tracked_objects::Location& from_here, |
184 const Closure& task, | 195 const Closure& task, |
185 TimeDelta delay) override; | 196 TimeDelta delay) override; |
186 bool RunsTasksOnCurrentThread() const override; | 197 bool RunsTasksOnCurrentThread() const override; |
187 | 198 |
188 // SequencedTaskRunner implementation | 199 // SequencedTaskRunner implementation |
189 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, | 200 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, |
190 const Closure& task, | 201 const Closure& task, |
191 TimeDelta delay) override; | 202 TimeDelta delay) override; |
192 | 203 |
193 private: | 204 private: |
194 ~SequencedWorkerPoolSequencedTaskRunner() override; | 205 ~PoolSequencedTaskRunner() override; |
195 | 206 |
196 const scoped_refptr<SequencedWorkerPool> pool_; | 207 const scoped_refptr<SequencedWorkerPool> pool_; |
197 | 208 |
198 const SequencedWorkerPool::SequenceToken token_; | 209 const SequencedWorkerPool::SequenceToken token_; |
199 | 210 |
200 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; | 211 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; |
201 | 212 |
202 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolSequencedTaskRunner); | 213 DISALLOW_COPY_AND_ASSIGN(PoolSequencedTaskRunner); |
203 }; | 214 }; |
204 | 215 |
205 SequencedWorkerPoolSequencedTaskRunner::SequencedWorkerPoolSequencedTaskRunner( | 216 SequencedWorkerPool::PoolSequencedTaskRunner:: |
206 scoped_refptr<SequencedWorkerPool> pool, | 217 PoolSequencedTaskRunner( |
207 SequencedWorkerPool::SequenceToken token, | 218 scoped_refptr<SequencedWorkerPool> pool, |
208 SequencedWorkerPool::WorkerShutdown shutdown_behavior) | 219 SequencedWorkerPool::SequenceToken token, |
| 220 SequencedWorkerPool::WorkerShutdown shutdown_behavior) |
209 : pool_(std::move(pool)), | 221 : pool_(std::move(pool)), |
210 token_(token), | 222 token_(token), |
211 shutdown_behavior_(shutdown_behavior) {} | 223 shutdown_behavior_(shutdown_behavior) {} |
212 | 224 |
213 SequencedWorkerPoolSequencedTaskRunner:: | 225 SequencedWorkerPool::PoolSequencedTaskRunner:: |
214 ~SequencedWorkerPoolSequencedTaskRunner() { | 226 ~PoolSequencedTaskRunner() = default; |
215 } | |
216 | 227 |
217 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTask( | 228 bool SequencedWorkerPool::PoolSequencedTaskRunner:: |
218 const tracked_objects::Location& from_here, | 229 PostDelayedTask(const tracked_objects::Location& from_here, |
219 const Closure& task, | 230 const Closure& task, |
220 TimeDelta delay) { | 231 TimeDelta delay) { |
221 if (delay.is_zero()) { | 232 if (delay.is_zero()) { |
222 return pool_->PostSequencedWorkerTaskWithShutdownBehavior( | 233 return pool_->PostSequencedWorkerTaskWithShutdownBehavior( |
223 token_, from_here, task, shutdown_behavior_); | 234 token_, from_here, task, shutdown_behavior_); |
224 } | 235 } |
225 return pool_->PostDelayedSequencedWorkerTask(token_, from_here, task, delay); | 236 return pool_->PostDelayedSequencedWorkerTask(token_, from_here, task, delay); |
226 } | 237 } |
227 | 238 |
228 bool SequencedWorkerPoolSequencedTaskRunner::RunsTasksOnCurrentThread() const { | 239 bool SequencedWorkerPool::PoolSequencedTaskRunner:: |
| 240 RunsTasksOnCurrentThread() const { |
229 return pool_->IsRunningSequenceOnCurrentThread(token_); | 241 return pool_->IsRunningSequenceOnCurrentThread(token_); |
230 } | 242 } |
231 | 243 |
232 bool SequencedWorkerPoolSequencedTaskRunner::PostNonNestableDelayedTask( | 244 bool SequencedWorkerPool::PoolSequencedTaskRunner:: |
233 const tracked_objects::Location& from_here, | 245 PostNonNestableDelayedTask(const tracked_objects::Location& from_here, |
234 const Closure& task, | 246 const Closure& task, |
235 TimeDelta delay) { | 247 TimeDelta delay) { |
236 // There's no way to run nested tasks, so simply forward to | 248 // There's no way to run nested tasks, so simply forward to |
237 // PostDelayedTask. | 249 // PostDelayedTask. |
238 return PostDelayedTask(from_here, task, delay); | 250 return PostDelayedTask(from_here, task, delay); |
239 } | 251 } |
240 | 252 |
241 // Create a process-wide unique ID to represent this task in trace events. This | |
242 // will be mangled with a Process ID hash to reduce the likelyhood of colliding | |
243 // with MessageLoop pointers on other processes. | |
244 uint64_t GetTaskTraceID(const SequencedTask& task, void* pool) { | |
245 return (static_cast<uint64_t>(task.trace_id) << 32) | | |
246 static_cast<uint64_t>(reinterpret_cast<intptr_t>(pool)); | |
247 } | |
248 | |
249 } // namespace | |
250 | |
251 // Worker --------------------------------------------------------------------- | 253 // Worker --------------------------------------------------------------------- |
252 | 254 |
253 class SequencedWorkerPool::Worker : public SimpleThread { | 255 class SequencedWorkerPool::Worker : public SimpleThread { |
254 public: | 256 public: |
255 // Hold a (cyclic) ref to |worker_pool|, since we want to keep it | 257 // Hold a (cyclic) ref to |worker_pool|, since we want to keep it |
256 // around as long as we are running. | 258 // around as long as we are running. |
257 Worker(scoped_refptr<SequencedWorkerPool> worker_pool, | 259 Worker(scoped_refptr<SequencedWorkerPool> worker_pool, |
258 int thread_number, | 260 int thread_number, |
259 const std::string& thread_name_prefix); | 261 const std::string& thread_name_prefix); |
260 ~Worker() override; | 262 ~Worker() override; |
(...skipping 1203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1464 } | 1466 } |
1465 | 1467 |
1466 scoped_refptr<SequencedTaskRunner> SequencedWorkerPool::GetSequencedTaskRunner( | 1468 scoped_refptr<SequencedTaskRunner> SequencedWorkerPool::GetSequencedTaskRunner( |
1467 SequenceToken token) { | 1469 SequenceToken token) { |
1468 return GetSequencedTaskRunnerWithShutdownBehavior(token, BLOCK_SHUTDOWN); | 1470 return GetSequencedTaskRunnerWithShutdownBehavior(token, BLOCK_SHUTDOWN); |
1469 } | 1471 } |
1470 | 1472 |
1471 scoped_refptr<SequencedTaskRunner> | 1473 scoped_refptr<SequencedTaskRunner> |
1472 SequencedWorkerPool::GetSequencedTaskRunnerWithShutdownBehavior( | 1474 SequencedWorkerPool::GetSequencedTaskRunnerWithShutdownBehavior( |
1473 SequenceToken token, WorkerShutdown shutdown_behavior) { | 1475 SequenceToken token, WorkerShutdown shutdown_behavior) { |
1474 return new SequencedWorkerPoolSequencedTaskRunner( | 1476 return new PoolSequencedTaskRunner( |
1475 this, token, shutdown_behavior); | 1477 this, token, shutdown_behavior); |
1476 } | 1478 } |
1477 | 1479 |
1478 scoped_refptr<TaskRunner> | 1480 scoped_refptr<TaskRunner> |
1479 SequencedWorkerPool::GetTaskRunnerWithShutdownBehavior( | 1481 SequencedWorkerPool::GetTaskRunnerWithShutdownBehavior( |
1480 WorkerShutdown shutdown_behavior) { | 1482 WorkerShutdown shutdown_behavior) { |
1481 return new SequencedWorkerPoolTaskRunner(this, shutdown_behavior); | 1483 return new SequencedWorkerPoolTaskRunner(this, shutdown_behavior); |
1482 } | 1484 } |
1483 | 1485 |
1484 bool SequencedWorkerPool::PostWorkerTask( | 1486 bool SequencedWorkerPool::PostWorkerTask( |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1547 const tracked_objects::Location& from_here, | 1549 const tracked_objects::Location& from_here, |
1548 const Closure& task, | 1550 const Closure& task, |
1549 TimeDelta delay) { | 1551 TimeDelta delay) { |
1550 return PostDelayedWorkerTask(from_here, task, delay); | 1552 return PostDelayedWorkerTask(from_here, task, delay); |
1551 } | 1553 } |
1552 | 1554 |
1553 bool SequencedWorkerPool::RunsTasksOnCurrentThread() const { | 1555 bool SequencedWorkerPool::RunsTasksOnCurrentThread() const { |
1554 return inner_->RunsTasksOnCurrentThread(); | 1556 return inner_->RunsTasksOnCurrentThread(); |
1555 } | 1557 } |
1556 | 1558 |
1557 bool SequencedWorkerPool::IsRunningSequenceOnCurrentThread( | |
1558 SequenceToken sequence_token) const { | |
1559 return inner_->IsRunningSequenceOnCurrentThread(sequence_token); | |
1560 } | |
1561 | |
1562 void SequencedWorkerPool::FlushForTesting() { | 1559 void SequencedWorkerPool::FlushForTesting() { |
1563 inner_->CleanupForTesting(); | 1560 inner_->CleanupForTesting(); |
1564 } | 1561 } |
1565 | 1562 |
1566 void SequencedWorkerPool::SignalHasWorkForTesting() { | 1563 void SequencedWorkerPool::SignalHasWorkForTesting() { |
1567 inner_->SignalHasWorkForTesting(); | 1564 inner_->SignalHasWorkForTesting(); |
1568 } | 1565 } |
1569 | 1566 |
1570 void SequencedWorkerPool::Shutdown(int max_new_blocking_tasks_after_shutdown) { | 1567 void SequencedWorkerPool::Shutdown(int max_new_blocking_tasks_after_shutdown) { |
1571 DCHECK(constructor_task_runner_->BelongsToCurrentThread()); | 1568 DCHECK(constructor_task_runner_->BelongsToCurrentThread()); |
1572 inner_->Shutdown(max_new_blocking_tasks_after_shutdown); | 1569 inner_->Shutdown(max_new_blocking_tasks_after_shutdown); |
1573 } | 1570 } |
1574 | 1571 |
1575 bool SequencedWorkerPool::IsShutdownInProgress() { | 1572 bool SequencedWorkerPool::IsShutdownInProgress() { |
1576 return inner_->IsShutdownInProgress(); | 1573 return inner_->IsShutdownInProgress(); |
1577 } | 1574 } |
1578 | 1575 |
| 1576 bool SequencedWorkerPool::IsRunningSequenceOnCurrentThread( |
| 1577 SequenceToken sequence_token) const { |
| 1578 return inner_->IsRunningSequenceOnCurrentThread(sequence_token); |
| 1579 } |
| 1580 |
1579 } // namespace base | 1581 } // namespace base |
OLD | NEW |