Chromium Code Reviews| Index: cc/raster_worker_pool.cc |
| diff --git a/cc/raster_worker_pool.cc b/cc/raster_worker_pool.cc |
| index 13113b5f1bfde8bf7289a9d32bad34de8d86ad99..9e9bb88f826ec49b2473d8f24ad052c50c048e0d 100644 |
| --- a/cc/raster_worker_pool.cc |
| +++ b/cc/raster_worker_pool.cc |
| @@ -22,12 +22,18 @@ class RasterWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
| } |
| virtual void Run(RenderingStats* rendering_stats) OVERRIDE { |
| - task_.Run(picture_pile_.get(), rendering_stats); |
| + task_.Run(picture_pile_, rendering_stats); |
| base::subtle::Release_Store(&completed_, 1); |
| } |
| + virtual void DeferToThread(base::Thread* thread) OVERRIDE { |
| + picture_pile_clone_ = picture_pile_ = |
| + picture_pile_->GetCloneForDrawingOnThread(thread); |
|
reveman
2013/02/14 21:10:49
DCHECK(!picture_pile_clone_) before this statement
Sami
2013/02/15 16:41:22
Good idea. This handles multiple calls fine, but w
|
| + } |
| + |
| private: |
| - scoped_refptr<PicturePileImpl> picture_pile_; |
| + PicturePileImpl* picture_pile_; |
| + scoped_refptr<PicturePileImpl> picture_pile_clone_; |
| RasterWorkerPool::RasterCallback task_; |
| }; |
| @@ -42,18 +48,20 @@ RasterWorkerPool::~RasterWorkerPool() { |
| } |
| void RasterWorkerPool::PostRasterTaskAndReply(PicturePileImpl* picture_pile, |
| + bool is_cheap, |
| const RasterCallback& task, |
| const base::Closure& reply) { |
| - Worker* worker = GetWorkerForNextTask(); |
| + scoped_ptr<internal::WorkerPoolTask> worker_task( |
| + new RasterWorkerPoolTaskImpl(picture_pile, task, reply)); |
| - scoped_refptr<PicturePileImpl> picture_pile_clone = |
| - picture_pile->GetCloneForDrawingOnThread(worker); |
| + if (is_cheap && CanPostCheapTask()) { |
| + PostCheapTask(worker_task.Pass()); |
| + return; |
| + } |
| - worker->PostTask( |
| - make_scoped_ptr(new RasterWorkerPoolTaskImpl( |
| - picture_pile_clone.get(), |
| - task, |
| - reply)).PassAs<internal::WorkerPoolTask>()); |
| + Worker* worker = GetWorkerForNextTask(); |
| + worker_task->DeferToThread(worker); |
|
reveman
2013/02/14 21:10:49
can we call this from WorkerPool::Worker::PostTask
Sami
2013/02/15 16:41:22
Yeah, that's much cleaner.
|
| + worker->PostTask(worker_task.Pass()); |
| } |
| } // namespace cc |