text: // Copyright (c) 2012 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #include "base/test/sequenced_worker_pool_owner.h"
  
  #include "base/location.h"
  #include "base/message_loop/message_loop.h"
  #include "base/single_thread_task_runner.h"
  
  namespace base {
  
  SequencedWorkerPoolOwner::SequencedWorkerPoolOwner(
      size_t max_threads,
      const std::string& thread_name_prefix)
      : constructor_message_loop_(MessageLoop::current()),
        pool_(new SequencedWorkerPool(max_threads,
                                      thread_name_prefix,
                                      TaskPriority::USER_VISIBLE,
                                      this)),
        has_work_call_count_(0) {}
  
  SequencedWorkerPoolOwner::~SequencedWorkerPoolOwner() {
    pool_->Shutdown();
    pool_ = nullptr;
  
    // Spin the current message loop until SWP destruction verified in OnDestruct.
    exit_loop_.Run();
  }
  
  const scoped_refptr<SequencedWorkerPool>& SequencedWorkerPoolOwner::pool()
      const {
    return pool_;
  }
  
  void SequencedWorkerPoolOwner::SetWillWaitForShutdownCallback(
      const Closure& callback) {
    will_wait_for_shutdown_callback_ = callback;
  }
  
  int SequencedWorkerPoolOwner::has_work_call_count() const {
    AutoLock lock(has_work_lock_);
    return has_work_call_count_;
  }
  
  void SequencedWorkerPoolOwner::OnHasWork() {
    AutoLock lock(has_work_lock_);
    ++has_work_call_count_;
  }
  
  void SequencedWorkerPoolOwner::WillWaitForShutdown() {
    if (!will_wait_for_shutdown_callback_.is_null()) {
      will_wait_for_shutdown_callback_.Run();
  
      // Release the reference to the callback to prevent retain cycles.
      will_wait_for_shutdown_callback_ = Closure();
    }
  }
  
  void SequencedWorkerPoolOwner::OnDestruct() {
    constructor_message_loop_->task_runner()->PostTask(FROM_HERE,
                                                       exit_loop_.QuitClosure());
  }
  
  }  // namespace base
  