| Index: cc/worker_pool.h
|
| diff --git a/cc/worker_pool.h b/cc/worker_pool.h
|
| index f47dd70b9981b23af18184c6c3f0ea911b051c12..4508c92fcb3dbfa743338013f402a1f8508f6943 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 WorkerPoolClient {
|
| + public:
|
| + virtual void DidFinishDispatchingCompletionCallbacks() = 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
|
| @@ -54,10 +68,6 @@ class WorkerPool {
|
| // is posted to the thread that called PostTaskAndReply().
|
| void PostTaskAndReply(const Callback& task, const base::Closure& reply);
|
|
|
| - // Returns true when worker pool has reached its internal limit for number
|
| - // of pending tasks.
|
| - bool IsBusy();
|
| -
|
| // Toggle rendering stats collection.
|
| void SetRecordRenderingStats(bool record_rendering_stats);
|
|
|
| @@ -76,6 +86,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 +102,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 +126,43 @@ 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();
|
| +
|
| + // Returns true when work has completed in worker thread but
|
| + // task completion has not yet been processed.
|
| + bool MoreTasksCompleted();
|
| +
|
| + // 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);
|
| };
|
|
|