| Index: base/threading/sequenced_worker_pool.cc
|
| diff --git a/base/threading/sequenced_worker_pool.cc b/base/threading/sequenced_worker_pool.cc
|
| index ed79897fd450f5e796bc9db5e79ffeeb59eed2ab..6e88877437f69e07a827bb0918eaa2517d085379 100644
|
| --- a/base/threading/sequenced_worker_pool.cc
|
| +++ b/base/threading/sequenced_worker_pool.cc
|
| @@ -296,7 +296,7 @@ class SequencedWorkerPool::Inner {
|
|
|
| ~Inner();
|
|
|
| - SequenceToken GetSequenceToken();
|
| + static SequenceToken GetSequenceToken();
|
|
|
| SequenceToken GetNamedSequenceToken(const std::string& name);
|
|
|
| @@ -314,6 +314,9 @@ class SequencedWorkerPool::Inner {
|
|
|
| bool IsRunningSequenceOnCurrentThread(SequenceToken sequence_token) const;
|
|
|
| + void SetRunningTaskInfoForCurrentThread(SequenceToken sequence_token,
|
| + WorkerShutdown shutdown_behavior);
|
| +
|
| void CleanupForTesting();
|
|
|
| void SignalHasWorkForTesting();
|
| @@ -583,6 +586,7 @@ SequencedWorkerPool::Inner::~Inner() {
|
| testing_observer_->OnDestruct();
|
| }
|
|
|
| +// static
|
| SequencedWorkerPool::SequenceToken
|
| SequencedWorkerPool::Inner::GetSequenceToken() {
|
| // Need to add one because StaticAtomicSequenceNumber starts at zero, which
|
| @@ -683,6 +687,17 @@ bool SequencedWorkerPool::Inner::IsRunningSequenceOnCurrentThread(
|
| sequence_token.Equals(found->second->task_sequence_token());
|
| }
|
|
|
| +void SequencedWorkerPool::Inner::SetRunningTaskInfoForCurrentThread(
|
| + SequenceToken sequence_token,
|
| + WorkerShutdown shutdown_behavior) {
|
| + AutoLock lock(lock_);
|
| + ThreadMap::const_iterator found = threads_.find(PlatformThread::CurrentId());
|
| + DCHECK(found != threads_.end());
|
| + DCHECK(found->second->is_processing_task());
|
| + DCHECK(!found->second->task_sequence_token().IsValid());
|
| + found->second->set_running_task_info(sequence_token, shutdown_behavior);
|
| +}
|
| +
|
| // See https://code.google.com/p/chromium/issues/detail?id=168415
|
| void SequencedWorkerPool::Inner::CleanupForTesting() {
|
| DCHECK(!RunsTasksOnCurrentThread());
|
| @@ -1181,13 +1196,24 @@ SequencedWorkerPool::GetSequenceTokenForCurrentThread() {
|
| }
|
|
|
| // static
|
| -scoped_refptr<SequencedWorkerPool>
|
| -SequencedWorkerPool::GetWorkerPoolForCurrentThread() {
|
| +scoped_refptr<SequencedTaskRunner>
|
| +SequencedWorkerPool::GetSequencedTaskRunnerForCurrentThread() {
|
| Worker* worker = Worker::GetForCurrentThread();
|
| if (!worker)
|
| return nullptr;
|
|
|
| - return worker->worker_pool();
|
| + scoped_refptr<SequencedWorkerPool> pool = worker->worker_pool();
|
| + SequenceToken sequence_token = worker->task_sequence_token();
|
| + WorkerShutdown shutdown_behavior = worker->task_shutdown_behavior();
|
| + if (!sequence_token.IsValid()) {
|
| + sequence_token = Inner::GetSequenceToken();
|
| + pool->inner_->SetRunningTaskInfoForCurrentThread(sequence_token,
|
| + shutdown_behavior);
|
| + }
|
| +
|
| + DCHECK(pool->IsRunningSequenceOnCurrentThread(sequence_token));
|
| + return new SequencedWorkerPoolSequencedTaskRunner(pool, sequence_token,
|
| + shutdown_behavior);
|
| }
|
|
|
| SequencedWorkerPool::SequencedWorkerPool(size_t max_threads,
|
| @@ -1206,8 +1232,7 @@ SequencedWorkerPool::SequencedWorkerPool(size_t max_threads,
|
| SequencedWorkerPool::~SequencedWorkerPool() {}
|
|
|
| void SequencedWorkerPool::OnDestruct() const {
|
| - // Avoid deleting ourselves on a worker thread (which would
|
| - // deadlock).
|
| + // Avoid deleting ourselves on a worker thread (which would deadlock).
|
| if (RunsTasksOnCurrentThread()) {
|
| constructor_task_runner_->DeleteSoon(FROM_HERE, this);
|
| } else {
|
| @@ -1215,8 +1240,9 @@ void SequencedWorkerPool::OnDestruct() const {
|
| }
|
| }
|
|
|
| +// static
|
| SequencedWorkerPool::SequenceToken SequencedWorkerPool::GetSequenceToken() {
|
| - return inner_->GetSequenceToken();
|
| + return Inner::GetSequenceToken();
|
| }
|
|
|
| SequencedWorkerPool::SequenceToken SequencedWorkerPool::GetNamedSequenceToken(
|
|
|