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