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

#if defined(COBALT)
  // Like PostTask, but blocks until the posted task completes. Returns false
  // and does not block if task was not posted.
  static bool PostBlockingTask(const tracked_objects::Location& from_here,
                               const base::Closure& task, bool task_is_slow);
#endif

  // Just like MessageLoopProxy::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);
};

}  // namespace base

#endif  // BASE_THREADING_WORKER_POOL_H_
