// 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"

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, this)),
      has_work_call_count_(0) {}

SequencedWorkerPoolOwner::~SequencedWorkerPoolOwner() {
  pool_ = NULL;
  MessageLoop::current()->Run();
}

const scoped_refptr<SequencedWorkerPool>& SequencedWorkerPoolOwner::pool() {
  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();
  }
}

void SequencedWorkerPoolOwner::OnDestruct() {
  constructor_message_loop_->PostTask(
      FROM_HERE,
      constructor_message_loop_->QuitWhenIdleClosure());
}

}  // namespace base
