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

Unified Diff: base/threading/sequenced_worker_pool.cc

Issue 9592037: Implement SequencedWorkerPool::RunsTasksOnCurrentThread() (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 9 months 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
« no previous file with comments | « base/task_runner_test_template.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/threading/sequenced_worker_pool.cc
diff --git a/base/threading/sequenced_worker_pool.cc b/base/threading/sequenced_worker_pool.cc
index b206ae00f1108cea001fa0f5f238aafe7f5042c5..136d64ed9301017b86341018ccdd1b0d91300b07 100644
--- a/base/threading/sequenced_worker_pool.cc
+++ b/base/threading/sequenced_worker_pool.cc
@@ -7,6 +7,7 @@
#include <list>
#include <map>
#include <set>
+#include <utility>
#include <vector>
#include "base/atomicops.h"
@@ -16,9 +17,11 @@
#include "base/memory/linked_ptr.h"
#include "base/message_loop_proxy.h"
#include "base/metrics/histogram.h"
+#include "base/stl_util.h"
#include "base/stringprintf.h"
#include "base/synchronization/condition_variable.h"
#include "base/synchronization/lock.h"
+#include "base/threading/platform_thread.h"
#include "base/threading/simple_thread.h"
#include "base/time.h"
#include "base/tracked_objects.h"
@@ -86,6 +89,8 @@ class SequencedWorkerPool::Inner {
const tracked_objects::Location& from_here,
const Closure& task);
+ bool RunsTasksOnCurrentThread() const;
+
void FlushForTesting();
void Shutdown();
@@ -151,7 +156,7 @@ class SequencedWorkerPool::Inner {
// This lock protects |everything in this class|. Do not read or modify
// anything without holding this lock. Do not block while holding this
// lock.
- Lock lock_;
+ mutable Lock lock_;
// Condition variable used to wake up worker threads when a task is runnable.
ConditionVariable cond_var_;
@@ -164,10 +169,11 @@ class SequencedWorkerPool::Inner {
// Associates all known sequence token names with their IDs.
std::map<std::string, int> named_sequence_tokens_;
- // Owning pointers to all threads we've created so far. Since we lazily
- // create threads, this may be less than max_threads_ and will be initially
- // empty.
- std::vector<linked_ptr<Worker> > threads_;
+ // Owning pointers to all threads we've created so far, indexed by
+ // ID. Since we lazily create threads, this may be less than
+ // max_threads_ and will be initially empty.
+ typedef std::map<PlatformThreadId, linked_ptr<Worker> > ThreadMap;
+ ThreadMap threads_;
// Set to true when we're in the process of creating another thread.
// See PrepareToStartAdditionalThreadIfHelpful for more.
@@ -256,8 +262,8 @@ SequencedWorkerPool::Inner::~Inner() {
// Need to explicitly join with the threads before they're destroyed or else
// they will be running when our object is half torn down.
- for (size_t i = 0; i < threads_.size(); i++)
- threads_[i]->Join();
+ for (ThreadMap::iterator it = threads_.begin(); it != threads_.end(); ++it)
+ it->second->Join();
threads_.clear();
if (testing_observer_)
@@ -317,6 +323,11 @@ bool SequencedWorkerPool::Inner::PostTask(
return true;
}
+bool SequencedWorkerPool::Inner::RunsTasksOnCurrentThread() const {
+ AutoLock lock(lock_);
+ return ContainsKey(threads_, PlatformThread::CurrentId());
+}
+
void SequencedWorkerPool::Inner::FlushForTesting() {
{
AutoLock lock(lock_);
@@ -377,7 +388,10 @@ void SequencedWorkerPool::Inner::ThreadLoop(Worker* this_worker) {
AutoLock lock(lock_);
DCHECK(thread_being_created_);
thread_being_created_ = false;
- threads_.push_back(linked_ptr<Worker>(this_worker));
+ std::pair<ThreadMap::iterator, bool> result =
+ threads_.insert(
+ std::make_pair(this_worker->tid(), make_linked_ptr(this_worker)));
+ DCHECK(result.second);
while (true) {
// See GetWork for what delete_these_outside_lock is doing.
@@ -729,10 +743,7 @@ bool SequencedWorkerPool::PostDelayedTask(
}
bool SequencedWorkerPool::RunsTasksOnCurrentThread() const {
- // TODO(akalin): Keep track of the thread IDs of our worker threads
- // and use those to implement this function.
- NOTREACHED();
- return true;
+ return inner_->RunsTasksOnCurrentThread();
}
void SequencedWorkerPool::FlushForTesting() {
« no previous file with comments | « base/task_runner_test_template.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698