// 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_ = NULL; // 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