Chromium Code Reviews| Index: base/threading/sequenced_worker_pool.cc |
| =================================================================== |
| --- base/threading/sequenced_worker_pool.cc (revision 126348) |
| +++ 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" |
| @@ -80,6 +81,14 @@ |
| SequenceToken GetNamedSequenceToken(const std::string& name); |
| + scoped_refptr<SequencedTaskRunner> GetSequencedTaskRunner(); |
| + |
| + scoped_refptr<SequencedTaskRunner> GetSequencedTaskRunner( |
|
akalin
2012/03/15 19:17:35
Overloads are against style guide -- I think there
Francois
2012/03/18 16:28:29
Done.
|
| + SequenceToken sequence_token); |
| + |
| + scoped_refptr<SequencedTaskRunner> GetSequencedTaskRunner( |
| + const std::string& token_name); |
| + |
| // 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. |
| @@ -113,6 +122,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. |
| @@ -159,6 +173,8 @@ |
| SequencedWorkerPool* const worker_pool_; |
| + WeakPtr<SequencedTaskRunner> sequenced_task_runner_; |
|
akalin
2012/03/15 19:17:35
no need for this member variable. Creating a new
Francois
2012/03/18 16:28:29
Do you mean that it should do "return scoped_refpt
|
| + |
| // The last sequence number used. Managed by GetSequenceToken, since this |
| // only does threadsafe increment operations, you do not need to hold the |
| // lock. |
| @@ -309,6 +325,26 @@ |
| return SequenceToken(LockedGetNamedTokenID(name)); |
| } |
| +scoped_refptr<SequencedTaskRunner> |
| +SequencedWorkerPool::Inner::GetSequencedTaskRunner() { |
| + AutoLock lock(lock_); |
| + return LockedGetSequencedTaskRunner(GetSequenceToken()); |
| +} |
| + |
| +scoped_refptr<SequencedTaskRunner> |
| +SequencedWorkerPool::Inner::GetSequencedTaskRunner(SequenceToken token) { |
| + AutoLock lock(lock_); |
|
akalin
2012/03/15 19:17:35
per the comments above, shouldn't need a lock for
|
| + return LockedGetSequencedTaskRunner(token); |
| +} |
| + |
| +scoped_refptr<SequencedTaskRunner> |
| +SequencedWorkerPool::Inner::GetSequencedTaskRunner( |
| + const std::string& token_name) { |
| + AutoLock lock(lock_); |
| + return LockedGetSequencedTaskRunner( |
| + SequenceToken(LockedGetNamedTokenID(token_name))); |
| +} |
| + |
| bool SequencedWorkerPool::Inner::PostTask( |
| const std::string* optional_token_name, |
| SequenceToken sequence_token, |
| @@ -496,6 +532,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) { |
| @@ -732,6 +780,21 @@ |
| return inner_->GetNamedSequenceToken(name); |
| } |
| +scoped_refptr<SequencedTaskRunner> SequencedWorkerPool::GetSequencedTaskRunner( |
| +) { |
| + return inner_->GetSequencedTaskRunner(); |
| +} |
| + |
| +scoped_refptr<SequencedTaskRunner> SequencedWorkerPool::GetSequencedTaskRunner( |
| + SequenceToken token) { |
| + return inner_->GetSequencedTaskRunner(token); |
| +} |
| + |
| +scoped_refptr<SequencedTaskRunner> SequencedWorkerPool::GetSequencedTaskRunner( |
| + const std::string& token_name) { |
| + return inner_->GetSequencedTaskRunner(token_name); |
| +} |
| + |
| bool SequencedWorkerPool::PostWorkerTask( |
| const tracked_objects::Location& from_here, |
| const Closure& task) { |