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..93e414f01406be94da69c38e6dedb381d47cb20f 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,16 @@ 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 +1195,23 @@ 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 +1230,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 +1238,9 @@ void SequencedWorkerPool::OnDestruct() const { |
} |
} |
+// static |
SequencedWorkerPool::SequenceToken SequencedWorkerPool::GetSequenceToken() { |
- return inner_->GetSequenceToken(); |
+ return Inner::GetSequenceToken(); |
} |
SequencedWorkerPool::SequenceToken SequencedWorkerPool::GetNamedSequenceToken( |