summaryrefslogtreecommitdiffstats
path: root/base/threading/sequenced_worker_pool.cc
diff options
context:
space:
mode:
Diffstat (limited to 'base/threading/sequenced_worker_pool.cc')
-rw-r--r--base/threading/sequenced_worker_pool.cc30
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();
}