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

#ifndef BASE_THREADING_WORKER_POOL_H_
#define BASE_THREADING_WORKER_POOL_H_

#include "base/base_export.h"
#include "base/callback_forward.h"
#include "base/memory/ref_counted.h"

class Task;

namespace tracked_objects {
class Location;
}  // namespace tracked_objects

namespace base {

class TaskRunner;

// This is a facility that runs tasks that don't require a specific thread or
// a message loop.
//
// WARNING: This shouldn't be used unless absolutely necessary. Typically
// (without calling ShutDownCleanly()), we don't wait for the worker pool
// threads to finish on shutdown, so the tasks running inside the pool must be
// extremely careful about other objects they access (MessageLoops, Singletons,
// etc). During shutdown these object may no longer exist.
class BASE_EXPORT WorkerPool {
 public:
  // This function posts |task| to run on a worker thread.  |task_is_slow|
  // should be used for tasks that will take a long time to execute.  Returns
  // false if |task| could not be posted to a worker thread.  Regardless of
  // return value, ownership of |task| is transferred to the worker pool.
  static bool PostTask(const tracked_objects::Location& from_here,
                       const base::Closure& task, bool task_is_slow);

  // Just like TaskRunner::PostTaskAndReply, except the destination
  // for |task| is a worker thread and you can specify |task_is_slow| just
  // like you can for PostTask above.
  static bool PostTaskAndReply(const tracked_objects::Location& from_here,
                               const Closure& task,
                               const Closure& reply,
                               bool task_is_slow);

  // Return true if the current thread is one that this WorkerPool runs tasks
  // on.  (Note that if the Windows worker pool is used without going through
  // this WorkerPool interface, RunsTasksOnCurrentThread would return false on
  // those threads.)
  static bool RunsTasksOnCurrentThread();

  // Get a TaskRunner wrapper which posts to the WorkerPool using the given
  // |task_is_slow| behavior.
  static const scoped_refptr<TaskRunner>& GetTaskRunner(bool task_is_slow);

  // Blocks until all worker threads quit cleanly. Please note that it ensures
  // that no worker threads are running after the method returns, but it doesn't
  // guarantee to process all queued pending tasks. This method may take a long
  // time. Please don't use it unless absolutely necessary, e.g., when we want
  // to unload the library containing the worker pool before process shutdown.
  static void ShutDownCleanly();
};

}  // namespace base

#endif  // BASE_THREADING_WORKER_POOL_H_
