blob: d6474e8541048068785d0f7cef7601551ae062cc [file] [log] [blame]
// Copyright 2013 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 CC_WORKER_POOL_H_
#define CC_WORKER_POOL_H_
#include <string>
#include "base/cancelable_callback.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/message_loop.h"
#include "cc/cc_export.h"
#include "cc/scoped_ptr_deque.h"
namespace cc {
struct RenderingStats;
namespace internal {
class WorkerPoolTask {
public:
virtual ~WorkerPoolTask();
virtual bool IsCheap() = 0;
// Called before running the task on a thread that isn't the origin thread.
virtual void WillRunOnThread(unsigned thread_index) = 0;
virtual void Run(RenderingStats* rendering_stats) = 0;
void DidComplete();
protected:
WorkerPoolTask(const base::Closure& reply);
const base::Closure reply_;
};
} // namespace internal
class CC_EXPORT WorkerPoolClient {
public:
virtual void DidFinishDispatchingWorkerPoolCompletionCallbacks() = 0;
protected:
virtual ~WorkerPoolClient() {}
};
// A worker thread pool that runs rendering tasks and guarantees completion
// of all pending tasks at shutdown.
class WorkerPool {
public:
typedef base::Callback<void(RenderingStats*)> Callback;
virtual ~WorkerPool();
static scoped_ptr<WorkerPool> Create(
WorkerPoolClient* client,
size_t num_threads,
base::TimeDelta check_for_completed_tasks_delay,
const std::string& thread_name_prefix) {
return make_scoped_ptr(new WorkerPool(client,
num_threads,
check_for_completed_tasks_delay,
thread_name_prefix));
}
// Tells the worker pool to shutdown and returns once all pending tasks have
// completed.
void Shutdown();
// Posts |task| to worker pool. On completion, |reply|
// is posted to the thread that called PostTaskAndReply().
void PostTaskAndReply(const Callback& task, const base::Closure& reply);
// Set time limit for running cheap tasks.
void SetRunCheapTasksTimeLimit(base::TimeTicks run_cheap_tasks_time_limit);
// Toggle rendering stats collection.
void SetRecordRenderingStats(bool record_rendering_stats);
// Collect rendering stats of all completed tasks.
void GetRenderingStats(RenderingStats* stats);
protected:
WorkerPool(WorkerPoolClient* client,
size_t num_threads,
base::TimeDelta check_for_completed_tasks_delay,
const std::string& thread_name_prefix);
void PostTask(scoped_ptr<internal::WorkerPoolTask> task);
private:
class Inner;
friend class Inner;
void OnTaskCompleted();
void OnIdle();
void ScheduleCheckForCompletedTasks();
void CheckForCompletedTasks();
void CancelCheckForCompletedTasks();
void DispatchCompletionCallbacks();
void ScheduleRunCheapTasks();
void RunCheapTasks();
WorkerPoolClient* client_;
scoped_refptr<base::MessageLoopProxy> origin_loop_;
base::WeakPtrFactory<WorkerPool> weak_ptr_factory_;
base::TimeTicks check_for_completed_tasks_time_;
base::TimeDelta check_for_completed_tasks_delay_;
base::CancelableClosure check_for_completed_tasks_callback_;
bool check_for_completed_tasks_pending_;
const base::Closure run_cheap_tasks_callback_;
base::TimeTicks run_cheap_tasks_time_limit_;
bool run_cheap_tasks_pending_;
// Holds all completed tasks for which we have not yet dispatched
// reply callbacks.
ScopedPtrDeque<internal::WorkerPoolTask> completed_tasks_;
// Hide the gory details of the worker pool in |inner_|.
const scoped_ptr<Inner> inner_;
DISALLOW_COPY_AND_ASSIGN(WorkerPool);
};
} // namespace cc
#endif // CC_WORKER_POOL_H_