Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3440)

Unified Diff: base/threading/sequenced_worker_pool.cc

Issue 1414793009: Allow SequencedTaskRunnerHandle::Get() while running unsequenced tasks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: remove base:: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
danakj 2015/11/17 22:03:39 Can you DCHECK that is_processing_task() is true?
Bernhard Bauer 2015/11/18 13:15:50 task_shutdown_behavior() already does that. Altern
danakj 2015/11/20 19:18:43 Can you add a comment at the !worker early out exp
Bernhard Bauer 2015/12/10 16:09:58 Done, modulo s/sequenced //, because a worker thre
+ if (!sequence_token.IsValid()) {
+ sequence_token = Inner::GetSequenceToken();
+ pool->inner_->SetRunningTaskInfoForCurrentThread(sequence_token,
danakj 2015/11/17 22:03:39 Why do you do this? Now the thread is left in a st
Bernhard Bauer 2015/11/18 13:15:50 I do this to make sure that a task posted to the n
danakj 2015/11/20 19:18:43 Can you encode this into a comment in here? And c
Bernhard Bauer 2015/12/10 16:09:58 Done.
danakj 2015/12/16 21:53:32 What about just calling it twice and making sure y
+ shutdown_behavior);
+ }
+
+ DCHECK(pool->IsRunningSequenceOnCurrentThread(sequence_token));
+ return new SequencedWorkerPoolSequencedTaskRunner(pool, sequence_token,
danakj 2015/11/17 22:03:39 can you move() the pool smart pointer? no need to
Bernhard Bauer 2015/11/18 13:15:50 Done.
+ 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(

Powered by Google App Engine
This is Rietveld 408576698