diff options
Diffstat (limited to 'base/threading/sequenced_worker_pool.cc')
-rw-r--r-- | base/threading/sequenced_worker_pool.cc | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/base/threading/sequenced_worker_pool.cc b/base/threading/sequenced_worker_pool.cc index be8f463..7054fba 100644 --- a/base/threading/sequenced_worker_pool.cc +++ b/base/threading/sequenced_worker_pool.cc @@ -63,8 +63,17 @@ class SequencedWorkerPool::Worker : public SimpleThread { // SimpleThread implementation. This actually runs the background thread. virtual void Run() OVERRIDE; + void set_running_sequence(SequenceToken token) { + running_sequence_ = token; + } + + SequenceToken running_sequence() const { + return running_sequence_; + } + private: scoped_refptr<SequencedWorkerPool> worker_pool_; + SequenceToken running_sequence_; DISALLOW_COPY_AND_ASSIGN(Worker); }; @@ -96,6 +105,8 @@ class SequencedWorkerPool::Inner { bool RunsTasksOnCurrentThread() const; + bool IsRunningSequenceOnCurrentThread(SequenceToken sequence_token) const; + void FlushForTesting(); void SignalHasWorkForTesting(); @@ -354,6 +365,15 @@ bool SequencedWorkerPool::Inner::RunsTasksOnCurrentThread() const { return ContainsKey(threads_, PlatformThread::CurrentId()); } +bool SequencedWorkerPool::Inner::IsRunningSequenceOnCurrentThread( + SequenceToken sequence_token) const { + AutoLock lock(lock_); + ThreadMap::const_iterator found = threads_.find(PlatformThread::CurrentId()); + if (found == threads_.end()) + return false; + return found->second->running_sequence().Equals(sequence_token); +} + void SequencedWorkerPool::Inner::FlushForTesting() { AutoLock lock(lock_); while (!IsIdle()) @@ -435,8 +455,13 @@ void SequencedWorkerPool::Inner::ThreadLoop(Worker* this_worker) { if (new_thread_id) FinishStartingAdditionalThread(new_thread_id); + this_worker->set_running_sequence( + SequenceToken(task.sequence_token_id)); + task.task.Run(); + this_worker->set_running_sequence(SequenceToken()); + // Make sure our task is erased outside the lock for the same reason // we do this with delete_these_oustide_lock. task.task = Closure(); @@ -796,6 +821,11 @@ bool SequencedWorkerPool::RunsTasksOnCurrentThread() const { return inner_->RunsTasksOnCurrentThread(); } +bool SequencedWorkerPool::IsRunningSequenceOnCurrentThread( + SequenceToken sequence_token) const { + return inner_->IsRunningSequenceOnCurrentThread(sequence_token); +} + void SequencedWorkerPool::FlushForTesting() { inner_->FlushForTesting(); } |