Chromium Code Reviews| Index: base/threading/sequenced_worker_pool.cc |
| diff --git a/base/threading/sequenced_worker_pool.cc b/base/threading/sequenced_worker_pool.cc |
| index fb71efeaea89c2f901a2e87ecebca02e25f45c39..cae4711a706c63207d2ed187f58df428f2814077 100644 |
| --- a/base/threading/sequenced_worker_pool.cc |
| +++ b/base/threading/sequenced_worker_pool.cc |
| @@ -117,6 +117,14 @@ struct SequencedTaskLessThan { |
| } |
| }; |
| +// Create a process-wide unique ID to represent this task in trace events. This |
| +// will be mangled with a Process ID hash to reduce the likelyhood of colliding |
| +// with MessageLoop pointers on other processes. |
| +uint64_t GetTaskTraceID(const SequencedTask& task, void* pool) { |
| + return (static_cast<uint64_t>(task.trace_id) << 32) | |
| + static_cast<uint64_t>(reinterpret_cast<intptr_t>(pool)); |
| +} |
| + |
| // SequencedWorkerPoolTaskRunner --------------------------------------------- |
| // A TaskRunner which posts tasks to a SequencedWorkerPool with a |
| // fixed ShutdownBehavior. |
| @@ -167,12 +175,15 @@ bool SequencedWorkerPoolTaskRunner::RunsTasksOnCurrentThread() const { |
| return pool_->RunsTasksOnCurrentThread(); |
| } |
| -// SequencedWorkerPoolSequencedTaskRunner ------------------------------------ |
| +} // namespace |
| + |
| +// SequencedWorkerPool::SequencedWorkerPoolSequencedTaskRunner --------------- |
|
robliao
2016/09/15 14:14:16
Make SequencedWorkerPool::SequencedTaskRunner or S
fdoray
2016/09/15 15:21:59
Done. (PoolSequencedTaskRunner instead of PoolTask
|
| // A SequencedTaskRunner which posts tasks to a SequencedWorkerPool with a |
| // fixed sequence token. |
| // |
| // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). |
| -class SequencedWorkerPoolSequencedTaskRunner : public SequencedTaskRunner { |
| +class SequencedWorkerPool::SequencedWorkerPoolSequencedTaskRunner |
| + : public SequencedTaskRunner { |
| public: |
| SequencedWorkerPoolSequencedTaskRunner( |
| scoped_refptr<SequencedWorkerPool> pool, |
| @@ -202,22 +213,22 @@ class SequencedWorkerPoolSequencedTaskRunner : public SequencedTaskRunner { |
| DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolSequencedTaskRunner); |
| }; |
| -SequencedWorkerPoolSequencedTaskRunner::SequencedWorkerPoolSequencedTaskRunner( |
| - scoped_refptr<SequencedWorkerPool> pool, |
| - SequencedWorkerPool::SequenceToken token, |
| - SequencedWorkerPool::WorkerShutdown shutdown_behavior) |
| +SequencedWorkerPool::SequencedWorkerPoolSequencedTaskRunner:: |
| + SequencedWorkerPoolSequencedTaskRunner( |
| + scoped_refptr<SequencedWorkerPool> pool, |
| + SequencedWorkerPool::SequenceToken token, |
| + SequencedWorkerPool::WorkerShutdown shutdown_behavior) |
| : pool_(std::move(pool)), |
| token_(token), |
| shutdown_behavior_(shutdown_behavior) {} |
| -SequencedWorkerPoolSequencedTaskRunner:: |
| -~SequencedWorkerPoolSequencedTaskRunner() { |
| -} |
| +SequencedWorkerPool::SequencedWorkerPoolSequencedTaskRunner:: |
| + ~SequencedWorkerPoolSequencedTaskRunner() = default; |
| -bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTask( |
| - const tracked_objects::Location& from_here, |
| - const Closure& task, |
| - TimeDelta delay) { |
| +bool SequencedWorkerPool::SequencedWorkerPoolSequencedTaskRunner:: |
| + PostDelayedTask(const tracked_objects::Location& from_here, |
| + const Closure& task, |
| + TimeDelta delay) { |
| if (delay.is_zero()) { |
| return pool_->PostSequencedWorkerTaskWithShutdownBehavior( |
| token_, from_here, task, shutdown_behavior_); |
| @@ -225,29 +236,20 @@ bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTask( |
| return pool_->PostDelayedSequencedWorkerTask(token_, from_here, task, delay); |
| } |
| -bool SequencedWorkerPoolSequencedTaskRunner::RunsTasksOnCurrentThread() const { |
| +bool SequencedWorkerPool::SequencedWorkerPoolSequencedTaskRunner:: |
| + RunsTasksOnCurrentThread() const { |
| return pool_->IsRunningSequenceOnCurrentThread(token_); |
| } |
| -bool SequencedWorkerPoolSequencedTaskRunner::PostNonNestableDelayedTask( |
| - const tracked_objects::Location& from_here, |
| - const Closure& task, |
| - TimeDelta delay) { |
| +bool SequencedWorkerPool::SequencedWorkerPoolSequencedTaskRunner:: |
| + PostNonNestableDelayedTask(const tracked_objects::Location& from_here, |
| + const Closure& task, |
| + TimeDelta delay) { |
| // There's no way to run nested tasks, so simply forward to |
| // PostDelayedTask. |
| return PostDelayedTask(from_here, task, delay); |
| } |
| -// Create a process-wide unique ID to represent this task in trace events. This |
| -// will be mangled with a Process ID hash to reduce the likelyhood of colliding |
| -// with MessageLoop pointers on other processes. |
| -uint64_t GetTaskTraceID(const SequencedTask& task, void* pool) { |
| - return (static_cast<uint64_t>(task.trace_id) << 32) | |
| - static_cast<uint64_t>(reinterpret_cast<intptr_t>(pool)); |
| -} |
| - |
| -} // namespace |
| - |
| // Worker --------------------------------------------------------------------- |
| class SequencedWorkerPool::Worker : public SimpleThread { |
| @@ -839,24 +841,13 @@ bool SequencedWorkerPool::Inner::RunsTasksOnCurrentThread() const { |
| bool SequencedWorkerPool::Inner::IsRunningSequenceOnCurrentThread( |
| SequenceToken sequence_token) const { |
| AutoLock lock(lock_); |
| - if (subtle::NoBarrier_Load(&g_all_pools_state) == |
| - AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER) { |
| - // TODO(gab): This currently only verifies that the current thread is a |
| - // thread on which a task bound to |sequence_token| *could* run, but it |
| - // doesn't verify that the current is *currently running* a task bound to |
| - // |sequence_token|. |
| - const auto sequenced_task_runner_it = |
| - sequenced_task_runner_map_.find(sequence_token.id_); |
| - return sequenced_task_runner_it != sequenced_task_runner_map_.end() && |
| - sequenced_task_runner_it->second->RunsTasksOnCurrentThread(); |
| - } else { |
| - ThreadMap::const_iterator found = |
| - threads_.find(PlatformThread::CurrentId()); |
| - if (found == threads_.end()) |
| - return false; |
| - return found->second->is_processing_task() && |
| - sequence_token.Equals(found->second->task_sequence_token()); |
| - } |
| + DCHECK_NE(subtle::NoBarrier_Load(&g_all_pools_state), |
|
gab
2016/09/15 13:50:47
Actually, under redirection: SWP::GetSequencedTask
fdoray
2016/09/15 15:21:59
You're right. This CL no longer changes IsRunningS
|
| + AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER); |
| + ThreadMap::const_iterator found = threads_.find(PlatformThread::CurrentId()); |
| + if (found == threads_.end()) |
|
gab
2016/09/15 13:50:47
Incorporate below, i.e.
return found != threads_.
fdoray
2016/09/15 15:21:59
I'll fix this method in a separate CL.
|
| + return false; |
| + return found->second->is_processing_task() && |
| + sequence_token.Equals(found->second->task_sequence_token()); |
| } |
| // See https://code.google.com/p/chromium/issues/detail?id=168415 |
| @@ -1554,11 +1545,6 @@ bool SequencedWorkerPool::RunsTasksOnCurrentThread() const { |
| return inner_->RunsTasksOnCurrentThread(); |
| } |
| -bool SequencedWorkerPool::IsRunningSequenceOnCurrentThread( |
| - SequenceToken sequence_token) const { |
| - return inner_->IsRunningSequenceOnCurrentThread(sequence_token); |
| -} |
| - |
| void SequencedWorkerPool::FlushForTesting() { |
| inner_->CleanupForTesting(); |
| } |
| @@ -1576,4 +1562,9 @@ bool SequencedWorkerPool::IsShutdownInProgress() { |
| return inner_->IsShutdownInProgress(); |
| } |
| +bool SequencedWorkerPool::IsRunningSequenceOnCurrentThread( |
| + SequenceToken sequence_token) const { |
| + return inner_->IsRunningSequenceOnCurrentThread(sequence_token); |
| +} |
| + |
| } // namespace base |