summaryrefslogtreecommitdiffstats
path: root/cc/worker_pool.h
diff options
context:
space:
mode:
Diffstat (limited to 'cc/worker_pool.h')
-rw-r--r--cc/worker_pool.h60
1 files changed, 52 insertions, 8 deletions
diff --git a/cc/worker_pool.h b/cc/worker_pool.h
index f47dd70..26bce7a 100644
--- a/cc/worker_pool.h
+++ b/cc/worker_pool.h
@@ -9,6 +9,7 @@
#include "base/basictypes.h"
#include "base/callback.h"
+#include "base/cancelable_callback.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/threading/thread.h"
@@ -24,16 +25,28 @@ class WorkerPoolTask {
virtual void Run(RenderingStats* rendering_stats) = 0;
- void Completed();
+ bool HasCompleted();
+ void DidComplete();
protected:
WorkerPoolTask(const base::Closure& reply);
- base::Closure reply_;
+ const base::Closure reply_;
+
+ // Accessed from multiple threads. Set to 1 when task has completed.
+ base::subtle::Atomic32 completed_;
};
} // 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 {
@@ -42,8 +55,9 @@ class WorkerPool {
virtual ~WorkerPool();
- static scoped_ptr<WorkerPool> Create(size_t num_threads) {
- return make_scoped_ptr(new WorkerPool(num_threads));
+ static scoped_ptr<WorkerPool> Create(
+ WorkerPoolClient* client, size_t num_threads) {
+ return make_scoped_ptr(new WorkerPool(client, num_threads));
}
// Tells the worker pool to shutdown and returns once all pending tasks have
@@ -76,6 +90,9 @@ class WorkerPool {
// Posts a task to the worker thread.
void PostTask(scoped_ptr<internal::WorkerPoolTask> task);
+ // Check for completed tasks and run reply callbacks.
+ void CheckForCompletedTasks();
+
int num_pending_tasks() const { return pending_tasks_.size(); }
void set_record_rendering_stats(bool record_rendering_stats) {
record_rendering_stats_ = record_rendering_stats;
@@ -89,18 +106,19 @@ class WorkerPool {
private:
static void RunTask(
- internal::WorkerPoolTask* task, RenderingStats* rendering_stats);
+ internal::WorkerPoolTask* task,
+ WorkerPool* worker_pool,
+ RenderingStats* rendering_stats);
void OnTaskCompleted();
WorkerPool* worker_pool_;
- base::WeakPtrFactory<Worker> weak_ptr_factory_;
ScopedPtrDeque<internal::WorkerPoolTask> pending_tasks_;
scoped_ptr<RenderingStats> rendering_stats_;
bool record_rendering_stats_;
};
- explicit WorkerPool(size_t num_threads);
+ WorkerPool(WorkerPoolClient* client, size_t num_threads);
WorkerPool::Worker* GetWorkerForNextTask();
@@ -112,13 +130,39 @@ class WorkerPool {
}
};
- void DidNumPendingTasksChange();
+ // Schedule a completed tasks check if not already pending.
+ void ScheduleCheckForCompletedTasks();
+
+ // Called on origin thread before posting task to worker.
+ void WillPostTask();
+
+ // Called on worker thread after completing work.
+ void OnWorkCompletedOnWorkerThread();
+
+ // Called on origin thread after becoming idle.
+ void OnIdle();
+
+ // Check for completed tasks and run reply callbacks.
+ void CheckForCompletedTasks();
+
+ // Called when processing task completion.
+ void OnTaskCompleted();
+
+ // Ensure workers are sorted by number of pending tasks.
void SortWorkersIfNeeded();
typedef std::vector<Worker*> WorkerVector;
WorkerVector workers_;
+ WorkerPoolClient* client_;
+ scoped_refptr<base::MessageLoopProxy> origin_loop_;
+ base::WeakPtrFactory<WorkerPool> weak_ptr_factory_;
bool workers_need_sorting_;
bool shutdown_;
+ base::CancelableClosure check_for_completed_tasks_callback_;
+ bool check_for_completed_tasks_pending_;
+ base::Closure idle_callback_;
+ // Accessed from multiple threads. 0 when worker pool is idle.
+ base::subtle::Atomic32 pending_task_count_;
DISALLOW_COPY_AND_ASSIGN(WorkerPool);
};