Index: base/threading/sequenced_worker_pool.cc |
=================================================================== |
--- base/threading/sequenced_worker_pool.cc (revision 127368) |
+++ base/threading/sequenced_worker_pool.cc (working copy) |
@@ -22,6 +22,7 @@ |
#include "base/synchronization/condition_variable.h" |
#include "base/synchronization/lock.h" |
#include "base/threading/platform_thread.h" |
+#include "base/threading/sequenced_task_runner_impl.h" |
#include "base/threading/simple_thread.h" |
#include "base/time.h" |
#include "base/tracked_objects.h" |
@@ -81,6 +82,9 @@ |
SequenceToken GetNamedSequenceToken(const std::string& name); |
+ scoped_refptr<SequencedTaskRunner> GetSequencedTaskRunner( |
+ SequenceToken sequence_token); |
+ |
// This function accepts a name and an ID. If the name is null, the |
// token ID is used. This allows us to implement the optional name lookup |
// from a single function without having to enter the lock a separate time. |
@@ -112,6 +116,11 @@ |
// token ID, creating a new one if necessary. |
int LockedGetNamedTokenID(const std::string& name); |
+ // Called from within the lock, this returns a reference to a |
+ // SequencedTaskRunner which wraps the SequencedWorkerPool object. |
+ scoped_refptr<SequencedTaskRunner> LockedGetSequencedTaskRunner( |
+ SequenceToken token); |
+ |
// The calling code should clear the given delete_these_oustide_lock |
// vector the next time the lock is released. See the implementation for |
// a more detailed description. |
@@ -158,6 +167,8 @@ |
SequencedWorkerPool* const worker_pool_; |
+ WeakPtr<SequencedTaskRunner> sequenced_task_runner_; |
+ |
// The last sequence number used. Managed by GetSequenceToken, since this |
// only does threadsafe increment operations, you do not need to hold the |
// lock. |
@@ -305,6 +316,12 @@ |
return SequenceToken(LockedGetNamedTokenID(name)); |
} |
+scoped_refptr<SequencedTaskRunner> |
+SequencedWorkerPool::Inner::GetSequencedTaskRunner(SequenceToken token) { |
+ AutoLock lock(lock_); |
+ return LockedGetSequencedTaskRunner(token); |
+} |
+ |
bool SequencedWorkerPool::Inner::PostTask( |
const std::string* optional_token_name, |
SequenceToken sequence_token, |
@@ -481,6 +498,18 @@ |
return result.id_; |
} |
+scoped_refptr<SequencedTaskRunner> |
+SequencedWorkerPool::Inner::LockedGetSequencedTaskRunner(SequenceToken token) { |
+ if (!sequenced_task_runner_) { |
+ scoped_refptr<SequencedTaskRunner> ref = new SequencedTaskRunnerImpl( |
+ scoped_refptr<SequencedWorkerPool>(worker_pool_), token); |
+ sequenced_task_runner_ = |
+ static_cast<SequencedTaskRunnerImpl*>(ref.get())->AsWeakPtr(); |
+ return ref; |
+ } |
+ return scoped_refptr<SequencedTaskRunner>(sequenced_task_runner_.get()); |
+} |
+ |
bool SequencedWorkerPool::Inner::GetWork( |
SequencedTask* task, |
std::vector<Closure>* delete_these_outside_lock) { |
@@ -725,6 +754,11 @@ |
return inner_->GetNamedSequenceToken(name); |
} |
+scoped_refptr<SequencedTaskRunner> SequencedWorkerPool::GetSequencedTaskRunner( |
+ SequenceToken token) { |
+ return inner_->GetSequencedTaskRunner(token); |
+} |
+ |
bool SequencedWorkerPool::PostWorkerTask( |
const tracked_objects::Location& from_here, |
const Closure& task) { |