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 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 return true; | 111 return true; |
112 | 112 |
113 if (lhs.time_to_run > rhs.time_to_run) | 113 if (lhs.time_to_run > rhs.time_to_run) |
114 return false; | 114 return false; |
115 | 115 |
116 // If the time happen to match, then we use the sequence number to decide. | 116 // If the time happen to match, then we use the sequence number to decide. |
117 return lhs.sequence_task_number < rhs.sequence_task_number; | 117 return lhs.sequence_task_number < rhs.sequence_task_number; |
118 } | 118 } |
119 }; | 119 }; |
120 | 120 |
| 121 // Create a process-wide unique ID to represent this task in trace events. This |
| 122 // will be mangled with a Process ID hash to reduce the likelyhood of colliding |
| 123 // with MessageLoop pointers on other processes. |
| 124 uint64_t GetTaskTraceID(const SequencedTask& task, void* pool) { |
| 125 return (static_cast<uint64_t>(task.trace_id) << 32) | |
| 126 static_cast<uint64_t>(reinterpret_cast<intptr_t>(pool)); |
| 127 } |
| 128 |
121 // SequencedWorkerPoolTaskRunner --------------------------------------------- | 129 // SequencedWorkerPoolTaskRunner --------------------------------------------- |
122 // A TaskRunner which posts tasks to a SequencedWorkerPool with a | 130 // A TaskRunner which posts tasks to a SequencedWorkerPool with a |
123 // fixed ShutdownBehavior. | 131 // fixed ShutdownBehavior. |
124 // | 132 // |
125 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). | 133 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). |
126 class SequencedWorkerPoolTaskRunner : public TaskRunner { | 134 class SequencedWorkerPoolTaskRunner : public TaskRunner { |
127 public: | 135 public: |
128 SequencedWorkerPoolTaskRunner( | 136 SequencedWorkerPoolTaskRunner( |
129 scoped_refptr<SequencedWorkerPool> pool, | 137 scoped_refptr<SequencedWorkerPool> pool, |
130 SequencedWorkerPool::WorkerShutdown shutdown_behavior); | 138 SequencedWorkerPool::WorkerShutdown shutdown_behavior); |
(...skipping 30 matching lines...) Expand all Loading... |
161 return pool_->PostWorkerTaskWithShutdownBehavior( | 169 return pool_->PostWorkerTaskWithShutdownBehavior( |
162 from_here, task, shutdown_behavior_); | 170 from_here, task, shutdown_behavior_); |
163 } | 171 } |
164 return pool_->PostDelayedWorkerTask(from_here, task, delay); | 172 return pool_->PostDelayedWorkerTask(from_here, task, delay); |
165 } | 173 } |
166 | 174 |
167 bool SequencedWorkerPoolTaskRunner::RunsTasksOnCurrentThread() const { | 175 bool SequencedWorkerPoolTaskRunner::RunsTasksOnCurrentThread() const { |
168 return pool_->RunsTasksOnCurrentThread(); | 176 return pool_->RunsTasksOnCurrentThread(); |
169 } | 177 } |
170 | 178 |
171 // SequencedWorkerPoolSequencedTaskRunner ------------------------------------ | 179 } // namespace |
| 180 |
| 181 // SequencedWorkerPool::PoolSequencedTaskRunner ------------------------------ |
172 // A SequencedTaskRunner which posts tasks to a SequencedWorkerPool with a | 182 // A SequencedTaskRunner which posts tasks to a SequencedWorkerPool with a |
173 // fixed sequence token. | 183 // fixed sequence token. |
174 // | 184 // |
175 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). | 185 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). |
176 class SequencedWorkerPoolSequencedTaskRunner : public SequencedTaskRunner { | 186 class SequencedWorkerPool::PoolSequencedTaskRunner |
| 187 : public SequencedTaskRunner { |
177 public: | 188 public: |
178 SequencedWorkerPoolSequencedTaskRunner( | 189 PoolSequencedTaskRunner( |
179 scoped_refptr<SequencedWorkerPool> pool, | 190 scoped_refptr<SequencedWorkerPool> pool, |
180 SequencedWorkerPool::SequenceToken token, | 191 SequencedWorkerPool::SequenceToken token, |
181 SequencedWorkerPool::WorkerShutdown shutdown_behavior); | 192 SequencedWorkerPool::WorkerShutdown shutdown_behavior); |
182 | 193 |
183 // TaskRunner implementation | 194 // TaskRunner implementation |
184 bool PostDelayedTask(const tracked_objects::Location& from_here, | 195 bool PostDelayedTask(const tracked_objects::Location& from_here, |
185 const Closure& task, | 196 const Closure& task, |
186 TimeDelta delay) override; | 197 TimeDelta delay) override; |
187 bool RunsTasksOnCurrentThread() const override; | 198 bool RunsTasksOnCurrentThread() const override; |
188 | 199 |
189 // SequencedTaskRunner implementation | 200 // SequencedTaskRunner implementation |
190 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, | 201 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, |
191 const Closure& task, | 202 const Closure& task, |
192 TimeDelta delay) override; | 203 TimeDelta delay) override; |
193 | 204 |
194 private: | 205 private: |
195 ~SequencedWorkerPoolSequencedTaskRunner() override; | 206 ~PoolSequencedTaskRunner() override; |
196 | 207 |
197 const scoped_refptr<SequencedWorkerPool> pool_; | 208 const scoped_refptr<SequencedWorkerPool> pool_; |
198 | 209 |
199 const SequencedWorkerPool::SequenceToken token_; | 210 const SequencedWorkerPool::SequenceToken token_; |
200 | 211 |
201 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; | 212 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; |
202 | 213 |
203 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolSequencedTaskRunner); | 214 DISALLOW_COPY_AND_ASSIGN(PoolSequencedTaskRunner); |
204 }; | 215 }; |
205 | 216 |
206 SequencedWorkerPoolSequencedTaskRunner::SequencedWorkerPoolSequencedTaskRunner( | 217 SequencedWorkerPool::PoolSequencedTaskRunner:: |
207 scoped_refptr<SequencedWorkerPool> pool, | 218 PoolSequencedTaskRunner( |
208 SequencedWorkerPool::SequenceToken token, | 219 scoped_refptr<SequencedWorkerPool> pool, |
209 SequencedWorkerPool::WorkerShutdown shutdown_behavior) | 220 SequencedWorkerPool::SequenceToken token, |
| 221 SequencedWorkerPool::WorkerShutdown shutdown_behavior) |
210 : pool_(std::move(pool)), | 222 : pool_(std::move(pool)), |
211 token_(token), | 223 token_(token), |
212 shutdown_behavior_(shutdown_behavior) {} | 224 shutdown_behavior_(shutdown_behavior) {} |
213 | 225 |
214 SequencedWorkerPoolSequencedTaskRunner:: | 226 SequencedWorkerPool::PoolSequencedTaskRunner:: |
215 ~SequencedWorkerPoolSequencedTaskRunner() { | 227 ~PoolSequencedTaskRunner() = default; |
216 } | |
217 | 228 |
218 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTask( | 229 bool SequencedWorkerPool::PoolSequencedTaskRunner:: |
219 const tracked_objects::Location& from_here, | 230 PostDelayedTask(const tracked_objects::Location& from_here, |
220 const Closure& task, | 231 const Closure& task, |
221 TimeDelta delay) { | 232 TimeDelta delay) { |
222 if (delay.is_zero()) { | 233 if (delay.is_zero()) { |
223 return pool_->PostSequencedWorkerTaskWithShutdownBehavior( | 234 return pool_->PostSequencedWorkerTaskWithShutdownBehavior( |
224 token_, from_here, task, shutdown_behavior_); | 235 token_, from_here, task, shutdown_behavior_); |
225 } | 236 } |
226 return pool_->PostDelayedSequencedWorkerTask(token_, from_here, task, delay); | 237 return pool_->PostDelayedSequencedWorkerTask(token_, from_here, task, delay); |
227 } | 238 } |
228 | 239 |
229 bool SequencedWorkerPoolSequencedTaskRunner::RunsTasksOnCurrentThread() const { | 240 bool SequencedWorkerPool::PoolSequencedTaskRunner:: |
| 241 RunsTasksOnCurrentThread() const { |
230 return pool_->IsRunningSequenceOnCurrentThread(token_); | 242 return pool_->IsRunningSequenceOnCurrentThread(token_); |
231 } | 243 } |
232 | 244 |
233 bool SequencedWorkerPoolSequencedTaskRunner::PostNonNestableDelayedTask( | 245 bool SequencedWorkerPool::PoolSequencedTaskRunner:: |
234 const tracked_objects::Location& from_here, | 246 PostNonNestableDelayedTask(const tracked_objects::Location& from_here, |
235 const Closure& task, | 247 const Closure& task, |
236 TimeDelta delay) { | 248 TimeDelta delay) { |
237 // There's no way to run nested tasks, so simply forward to | 249 // There's no way to run nested tasks, so simply forward to |
238 // PostDelayedTask. | 250 // PostDelayedTask. |
239 return PostDelayedTask(from_here, task, delay); | 251 return PostDelayedTask(from_here, task, delay); |
240 } | 252 } |
241 | 253 |
242 // Create a process-wide unique ID to represent this task in trace events. This | |
243 // will be mangled with a Process ID hash to reduce the likelyhood of colliding | |
244 // with MessageLoop pointers on other processes. | |
245 uint64_t GetTaskTraceID(const SequencedTask& task, void* pool) { | |
246 return (static_cast<uint64_t>(task.trace_id) << 32) | | |
247 static_cast<uint64_t>(reinterpret_cast<intptr_t>(pool)); | |
248 } | |
249 | |
250 } // namespace | |
251 | |
252 // Worker --------------------------------------------------------------------- | 254 // Worker --------------------------------------------------------------------- |
253 | 255 |
254 class SequencedWorkerPool::Worker : public SimpleThread { | 256 class SequencedWorkerPool::Worker : public SimpleThread { |
255 public: | 257 public: |
256 // Hold a (cyclic) ref to |worker_pool|, since we want to keep it | 258 // Hold a (cyclic) ref to |worker_pool|, since we want to keep it |
257 // around as long as we are running. | 259 // around as long as we are running. |
258 Worker(scoped_refptr<SequencedWorkerPool> worker_pool, | 260 Worker(scoped_refptr<SequencedWorkerPool> worker_pool, |
259 int thread_number, | 261 int thread_number, |
260 const std::string& thread_name_prefix); | 262 const std::string& thread_name_prefix); |
261 ~Worker() override; | 263 ~Worker() override; |
(...skipping 1241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1503 } | 1505 } |
1504 | 1506 |
1505 scoped_refptr<SequencedTaskRunner> SequencedWorkerPool::GetSequencedTaskRunner( | 1507 scoped_refptr<SequencedTaskRunner> SequencedWorkerPool::GetSequencedTaskRunner( |
1506 SequenceToken token) { | 1508 SequenceToken token) { |
1507 return GetSequencedTaskRunnerWithShutdownBehavior(token, BLOCK_SHUTDOWN); | 1509 return GetSequencedTaskRunnerWithShutdownBehavior(token, BLOCK_SHUTDOWN); |
1508 } | 1510 } |
1509 | 1511 |
1510 scoped_refptr<SequencedTaskRunner> | 1512 scoped_refptr<SequencedTaskRunner> |
1511 SequencedWorkerPool::GetSequencedTaskRunnerWithShutdownBehavior( | 1513 SequencedWorkerPool::GetSequencedTaskRunnerWithShutdownBehavior( |
1512 SequenceToken token, WorkerShutdown shutdown_behavior) { | 1514 SequenceToken token, WorkerShutdown shutdown_behavior) { |
1513 return new SequencedWorkerPoolSequencedTaskRunner( | 1515 return new PoolSequencedTaskRunner( |
1514 this, token, shutdown_behavior); | 1516 this, token, shutdown_behavior); |
1515 } | 1517 } |
1516 | 1518 |
1517 scoped_refptr<TaskRunner> | 1519 scoped_refptr<TaskRunner> |
1518 SequencedWorkerPool::GetTaskRunnerWithShutdownBehavior( | 1520 SequencedWorkerPool::GetTaskRunnerWithShutdownBehavior( |
1519 WorkerShutdown shutdown_behavior) { | 1521 WorkerShutdown shutdown_behavior) { |
1520 return new SequencedWorkerPoolTaskRunner(this, shutdown_behavior); | 1522 return new SequencedWorkerPoolTaskRunner(this, shutdown_behavior); |
1521 } | 1523 } |
1522 | 1524 |
1523 bool SequencedWorkerPool::PostWorkerTask( | 1525 bool SequencedWorkerPool::PostWorkerTask( |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1586 const tracked_objects::Location& from_here, | 1588 const tracked_objects::Location& from_here, |
1587 const Closure& task, | 1589 const Closure& task, |
1588 TimeDelta delay) { | 1590 TimeDelta delay) { |
1589 return PostDelayedWorkerTask(from_here, task, delay); | 1591 return PostDelayedWorkerTask(from_here, task, delay); |
1590 } | 1592 } |
1591 | 1593 |
1592 bool SequencedWorkerPool::RunsTasksOnCurrentThread() const { | 1594 bool SequencedWorkerPool::RunsTasksOnCurrentThread() const { |
1593 return inner_->RunsTasksOnCurrentThread(); | 1595 return inner_->RunsTasksOnCurrentThread(); |
1594 } | 1596 } |
1595 | 1597 |
1596 bool SequencedWorkerPool::IsRunningSequenceOnCurrentThread( | |
1597 SequenceToken sequence_token) const { | |
1598 return inner_->IsRunningSequenceOnCurrentThread(sequence_token); | |
1599 } | |
1600 | |
1601 void SequencedWorkerPool::FlushForTesting() { | 1598 void SequencedWorkerPool::FlushForTesting() { |
1602 inner_->CleanupForTesting(); | 1599 inner_->CleanupForTesting(); |
1603 } | 1600 } |
1604 | 1601 |
1605 void SequencedWorkerPool::SignalHasWorkForTesting() { | 1602 void SequencedWorkerPool::SignalHasWorkForTesting() { |
1606 inner_->SignalHasWorkForTesting(); | 1603 inner_->SignalHasWorkForTesting(); |
1607 } | 1604 } |
1608 | 1605 |
1609 void SequencedWorkerPool::Shutdown(int max_new_blocking_tasks_after_shutdown) { | 1606 void SequencedWorkerPool::Shutdown(int max_new_blocking_tasks_after_shutdown) { |
1610 DCHECK(constructor_task_runner_->BelongsToCurrentThread()); | 1607 DCHECK(constructor_task_runner_->BelongsToCurrentThread()); |
1611 inner_->Shutdown(max_new_blocking_tasks_after_shutdown); | 1608 inner_->Shutdown(max_new_blocking_tasks_after_shutdown); |
1612 } | 1609 } |
1613 | 1610 |
1614 bool SequencedWorkerPool::IsShutdownInProgress() { | 1611 bool SequencedWorkerPool::IsShutdownInProgress() { |
1615 return inner_->IsShutdownInProgress(); | 1612 return inner_->IsShutdownInProgress(); |
1616 } | 1613 } |
1617 | 1614 |
| 1615 bool SequencedWorkerPool::IsRunningSequenceOnCurrentThread( |
| 1616 SequenceToken sequence_token) const { |
| 1617 return inner_->IsRunningSequenceOnCurrentThread(sequence_token); |
| 1618 } |
| 1619 |
1618 } // namespace base | 1620 } // namespace base |
OLD | NEW |