| Index: cc/resources/raster_worker_pool.h
|
| diff --git a/cc/resources/raster_worker_pool.h b/cc/resources/raster_worker_pool.h
|
| index 8d3691d8ef534b49453907fdbd4623c691c60e82..bc156a08c4227996fb7cd8eb499e3a307b7577bc 100644
|
| --- a/cc/resources/raster_worker_pool.h
|
| +++ b/cc/resources/raster_worker_pool.h
|
| @@ -5,17 +5,86 @@
|
| #ifndef CC_RESOURCES_RASTER_WORKER_POOL_H_
|
| #define CC_RESOURCES_RASTER_WORKER_POOL_H_
|
|
|
| -#include <string>
|
| +#include <deque>
|
|
|
| #include "cc/base/worker_pool.h"
|
|
|
| namespace cc {
|
| class PicturePileImpl;
|
|
|
| +namespace internal {
|
| +
|
| +class RasterWorkerPoolTask : public WorkerPoolTask {
|
| + public:
|
| + typedef base::Callback<void(bool)> Reply;
|
| +
|
| + // Overridden from internal::WorkerPoolTask:
|
| + virtual void DispatchCompletionCallback() OVERRIDE;
|
| +
|
| + void DidSchedule();
|
| +
|
| + protected:
|
| + explicit RasterWorkerPoolTask(const Reply& reply);
|
| + virtual ~RasterWorkerPoolTask();
|
| +
|
| + void WillRun();
|
| + void DidRun();
|
| +
|
| + const Reply reply_;
|
| + bool did_schedule_;
|
| + bool did_run_;
|
| + bool did_complete_;
|
| +};
|
| +
|
| +} // namespace internal
|
| +
|
| // A worker thread pool that runs raster tasks.
|
| class RasterWorkerPool : public WorkerPool {
|
| public:
|
| - typedef base::Callback<void(PicturePileImpl* picture_pile)> RasterCallback;
|
| + class Task {
|
| + public:
|
| + typedef base::Callback<void(bool)> Reply;
|
| +
|
| + class Queue {
|
| + public:
|
| + Queue();
|
| + ~Queue();
|
| +
|
| + void Append(const Task& task);
|
| +
|
| + unsigned size() const { return tasks_.size(); }
|
| +
|
| + private:
|
| + friend class RasterWorkerPool;
|
| +
|
| + typedef std::deque<scoped_refptr<internal::RasterWorkerPoolTask> > Deque;
|
| + Deque tasks_;
|
| + };
|
| +
|
| + Task();
|
| + Task(const base::Closure& callback, const Reply& reply);
|
| + ~Task();
|
| +
|
| + // Returns true if Task is null (doesn't refer to anything).
|
| + bool is_null() const { return !internal_; }
|
| +
|
| + // Returns the Task into an uninitialized state.
|
| + void Reset();
|
| +
|
| + protected:
|
| + explicit Task(scoped_refptr<internal::RasterWorkerPoolTask> internal);
|
| +
|
| + scoped_refptr<internal::RasterWorkerPoolTask> internal_;
|
| + };
|
| +
|
| + class PictureTask : public Task {
|
| + public:
|
| + typedef base::Callback<void(PicturePileImpl*)> Callback;
|
| +
|
| + PictureTask(PicturePileImpl* picture_pile,
|
| + const Callback& callback,
|
| + const Reply& reply);
|
| + };
|
|
|
| virtual ~RasterWorkerPool();
|
|
|
| @@ -24,9 +93,12 @@ class RasterWorkerPool : public WorkerPool {
|
| return make_scoped_ptr(new RasterWorkerPool(client, num_threads));
|
| }
|
|
|
| - void PostRasterTaskAndReply(PicturePileImpl* picture_pile,
|
| - const RasterCallback& task,
|
| - const base::Closure& reply);
|
| + // Schedule running of tasks in |queue|. All tasks previously scheduled
|
| + // but not present in |queue| will be canceled. Once scheduled,
|
| + // reply callbacks are guaranteed to run for all tasks even if they
|
| + // later get canceled by another call to ScheduleTasks(). This consumed
|
| + // all tasks and queue will be empty when function returns.
|
| + void ScheduleTasks(Task::Queue* queue);
|
|
|
| private:
|
| RasterWorkerPool(WorkerPoolClient* client, size_t num_threads);
|
|
|