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 |