| Index: base/threading/sequenced_worker_pool.cc
|
| diff --git a/base/threading/sequenced_worker_pool.cc b/base/threading/sequenced_worker_pool.cc
|
| index d542733291a4351fbfabd2a1abe2bccd3ca5a285..d517d21e89eeec994c5f9e9063b38619c26ccc8d 100644
|
| --- a/base/threading/sequenced_worker_pool.cc
|
| +++ b/base/threading/sequenced_worker_pool.cc
|
| @@ -72,7 +72,8 @@ class SequencedWorkerPool::Inner {
|
| // Take a raw pointer to |worker| to avoid cycles (since we're owned
|
| // by it).
|
| Inner(SequencedWorkerPool* worker_pool, size_t max_threads,
|
| - const std::string& thread_name_prefix);
|
| + const std::string& thread_name_prefix,
|
| + TestingObserver* observer);
|
|
|
| ~Inner();
|
|
|
| @@ -93,14 +94,12 @@ class SequencedWorkerPool::Inner {
|
|
|
| void FlushForTesting();
|
|
|
| - void TriggerSpuriousWorkSignalForTesting();
|
| + void SignalHasWorkForTesting();
|
|
|
| int GetWorkSignalCountForTesting() const;
|
|
|
| void Shutdown();
|
|
|
| - void SetTestingObserver(TestingObserver* observer);
|
| -
|
| // Runs the worker loop on the background thread.
|
| void ThreadLoop(Worker* this_worker);
|
|
|
| @@ -173,9 +172,6 @@ class SequencedWorkerPool::Inner {
|
| // tasks are posted or shutdown starts.
|
| ConditionVariable has_work_cv_;
|
|
|
| - // Number of times |has_work_| has been signalled. Used for testing.
|
| - int has_work_signal_count_;
|
| -
|
| // Condition variable that is waited on by non-worker threads (in
|
| // FlushForTesting()) until IsIdle() goes to true.
|
| ConditionVariable is_idle_cv_;
|
| @@ -228,7 +224,7 @@ class SequencedWorkerPool::Inner {
|
| // allowed, though we may still be running existing tasks.
|
| bool shutdown_called_;
|
|
|
| - TestingObserver* testing_observer_;
|
| + TestingObserver* const testing_observer_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(Inner);
|
| };
|
| @@ -264,12 +260,12 @@ void SequencedWorkerPool::Worker::Run() {
|
| SequencedWorkerPool::Inner::Inner(
|
| SequencedWorkerPool* worker_pool,
|
| size_t max_threads,
|
| - const std::string& thread_name_prefix)
|
| + const std::string& thread_name_prefix,
|
| + TestingObserver* observer)
|
| : worker_pool_(worker_pool),
|
| last_sequence_number_(0),
|
| lock_(),
|
| has_work_cv_(&lock_),
|
| - has_work_signal_count_(0),
|
| is_idle_cv_(&lock_),
|
| can_shutdown_cv_(&lock_),
|
| max_threads_(max_threads),
|
| @@ -280,7 +276,7 @@ SequencedWorkerPool::Inner::Inner(
|
| pending_task_count_(0),
|
| blocking_shutdown_pending_task_count_(0),
|
| shutdown_called_(false),
|
| - testing_observer_(NULL) {}
|
| + testing_observer_(observer) {}
|
|
|
| SequencedWorkerPool::Inner::~Inner() {
|
| // You must call Shutdown() before destroying the pool.
|
| @@ -360,15 +356,10 @@ void SequencedWorkerPool::Inner::FlushForTesting() {
|
| is_idle_cv_.Wait();
|
| }
|
|
|
| -void SequencedWorkerPool::Inner::TriggerSpuriousWorkSignalForTesting() {
|
| +void SequencedWorkerPool::Inner::SignalHasWorkForTesting() {
|
| SignalHasWork();
|
| }
|
|
|
| -int SequencedWorkerPool::Inner::GetWorkSignalCountForTesting() const {
|
| - AutoLock lock(lock_);
|
| - return has_work_signal_count_;
|
| -}
|
| -
|
| void SequencedWorkerPool::Inner::Shutdown() {
|
| // Mark us as terminated and go through and drop all tasks that aren't
|
| // required to run on shutdown. Since no new tasks will get posted once the
|
| @@ -383,7 +374,7 @@ void SequencedWorkerPool::Inner::Shutdown() {
|
|
|
| // Tickle the threads. This will wake up a waiting one so it will know that
|
| // it can exit, which in turn will wake up any other waiting ones.
|
| - has_work_cv_.Signal();
|
| + SignalHasWork();
|
|
|
| // There are no pending or running tasks blocking shutdown, we're done.
|
| if (CanShutdown())
|
| @@ -407,12 +398,6 @@ void SequencedWorkerPool::Inner::Shutdown() {
|
| TimeTicks::Now() - shutdown_wait_begin);
|
| }
|
|
|
| -void SequencedWorkerPool::Inner::SetTestingObserver(
|
| - TestingObserver* observer) {
|
| - AutoLock lock(lock_);
|
| - testing_observer_ = observer;
|
| -}
|
| -
|
| void SequencedWorkerPool::Inner::ThreadLoop(Worker* this_worker) {
|
| {
|
| AutoLock lock(lock_);
|
| @@ -435,7 +420,7 @@ void SequencedWorkerPool::Inner::ThreadLoop(Worker* this_worker) {
|
| // worker thread. (Technically not required, since we
|
| // already get a signal for each new task, but it doesn't
|
| // hurt.)
|
| - has_work_cv_.Signal();
|
| + SignalHasWork();
|
| delete_these_outside_lock.clear();
|
|
|
| // Complete thread creation outside the lock if necessary.
|
| @@ -469,7 +454,7 @@ void SequencedWorkerPool::Inner::ThreadLoop(Worker* this_worker) {
|
|
|
| // We noticed we should exit. Wake up the next worker so it knows it should
|
| // exit as well (because the Shutdown() code only signals once).
|
| - has_work_cv_.Signal();
|
| + SignalHasWork();
|
|
|
| // Possibly unblock shutdown.
|
| can_shutdown_cv_.Signal();
|
| @@ -686,9 +671,8 @@ void SequencedWorkerPool::Inner::FinishStartingAdditionalThread(
|
|
|
| void SequencedWorkerPool::Inner::SignalHasWork() {
|
| has_work_cv_.Signal();
|
| - {
|
| - AutoLock lock(lock_);
|
| - ++has_work_signal_count_;
|
| + if (testing_observer_) {
|
| + testing_observer_->OnHasWork();
|
| }
|
| }
|
|
|
| @@ -707,7 +691,17 @@ SequencedWorkerPool::SequencedWorkerPool(
|
| const std::string& thread_name_prefix)
|
| : constructor_message_loop_(MessageLoopProxy::current()),
|
| inner_(new Inner(ALLOW_THIS_IN_INITIALIZER_LIST(this),
|
| - max_threads, thread_name_prefix)) {
|
| + max_threads, thread_name_prefix, NULL)) {
|
| + DCHECK(constructor_message_loop_.get());
|
| +}
|
| +
|
| +SequencedWorkerPool::SequencedWorkerPool(
|
| + size_t max_threads,
|
| + const std::string& thread_name_prefix,
|
| + TestingObserver* observer)
|
| + : constructor_message_loop_(MessageLoopProxy::current()),
|
| + inner_(new Inner(ALLOW_THIS_IN_INITIALIZER_LIST(this),
|
| + max_threads, thread_name_prefix, observer)) {
|
| DCHECK(constructor_message_loop_.get());
|
| }
|
|
|
| @@ -799,12 +793,8 @@ void SequencedWorkerPool::FlushForTesting() {
|
| inner_->FlushForTesting();
|
| }
|
|
|
| -void SequencedWorkerPool::TriggerSpuriousWorkSignalForTesting() {
|
| - inner_->TriggerSpuriousWorkSignalForTesting();
|
| -}
|
| -
|
| -int SequencedWorkerPool::GetWorkSignalCountForTesting() const {
|
| - return inner_->GetWorkSignalCountForTesting();
|
| +void SequencedWorkerPool::SignalHasWorkForTesting() {
|
| + inner_->SignalHasWorkForTesting();
|
| }
|
|
|
| void SequencedWorkerPool::Shutdown() {
|
| @@ -812,8 +802,4 @@ void SequencedWorkerPool::Shutdown() {
|
| inner_->Shutdown();
|
| }
|
|
|
| -void SequencedWorkerPool::SetTestingObserver(TestingObserver* observer) {
|
| - inner_->SetTestingObserver(observer);
|
| -}
|
| -
|
| } // namespace base
|
|
|