| 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 |