diff options
author | reveman@chromium.org <reveman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-09 14:26:58 +0000 |
---|---|---|
committer | reveman@chromium.org <reveman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-09 14:26:58 +0000 |
commit | 8f8bd29f1b5049ef141b409f2ddccdd940e2cadc (patch) | |
tree | a61b546c7d0379c6d963c7f4b61c966d34192a35 /cc/raster_worker_pool.cc | |
parent | 521475b3fa3e5333a022854a70844a4a46c84d5a (diff) | |
download | chromium_src-8f8bd29f1b5049ef141b409f2ddccdd940e2cadc.zip chromium_src-8f8bd29f1b5049ef141b409f2ddccdd940e2cadc.tar.gz chromium_src-8f8bd29f1b5049ef141b409f2ddccdd940e2cadc.tar.bz2 |
cc: Implement raster worker thread pool using shared queue.
This is an implementation of the worker pool using as shared queue
instead of using message loops. It improves efficiency and load
balancing between threads significantly.
This changes the behavior of cheap tasks a bit. Cheap tasks are now
shared between compositor thread and worker threads. Compositor
thread will run cheap tasks until time limit is reached. Worker threads
can always run cheap tasks. The time limit decision for cheap tasks is
moved to the consumer where this decision can be properly made.
BUG=178239
Review URL: https://chromiumcodereview.appspot.com/12398002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@187145 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/raster_worker_pool.cc')
-rw-r--r-- | cc/raster_worker_pool.cc | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/cc/raster_worker_pool.cc b/cc/raster_worker_pool.cc index e0210e6..316b962 100644 --- a/cc/raster_worker_pool.cc +++ b/cc/raster_worker_pool.cc @@ -13,33 +13,44 @@ namespace { class RasterWorkerPoolTaskImpl : public internal::WorkerPoolTask { public: RasterWorkerPoolTaskImpl(PicturePileImpl* picture_pile, + bool is_cheap, const RasterWorkerPool::RasterCallback& task, const base::Closure& reply) : internal::WorkerPoolTask(reply), picture_pile_(picture_pile), + is_cheap_(is_cheap), task_(task) { DCHECK(picture_pile_); } + virtual bool IsCheap() OVERRIDE { return is_cheap_; } + virtual void WillRunOnThread(unsigned thread_index) OVERRIDE { picture_pile_ = picture_pile_->GetCloneForDrawingOnThread(thread_index); } virtual void Run(RenderingStats* rendering_stats) OVERRIDE { task_.Run(picture_pile_.get(), rendering_stats); - base::subtle::Release_Store(&completed_, 1); } private: scoped_refptr<PicturePileImpl> picture_pile_; + bool is_cheap_; RasterWorkerPool::RasterCallback task_; }; +const char* kWorkerThreadNamePrefix = "CompositorRaster"; + +const int kCheckForCompletedTasksDelayMs = 6; + } // namespace RasterWorkerPool::RasterWorkerPool( - WorkerPoolClient* client, size_t num_threads) - : WorkerPool(client, num_threads) { + WorkerPoolClient* client, size_t num_threads) : WorkerPool( + client, + num_threads, + base::TimeDelta::FromMilliseconds(kCheckForCompletedTasksDelayMs), + kWorkerThreadNamePrefix) { } RasterWorkerPool::~RasterWorkerPool() { @@ -49,12 +60,11 @@ void RasterWorkerPool::PostRasterTaskAndReply(PicturePileImpl* picture_pile, bool is_cheap, const RasterCallback& task, const base::Closure& reply) { - PostTask( - make_scoped_ptr(new RasterWorkerPoolTaskImpl( - picture_pile, - task, - reply)).PassAs<internal::WorkerPoolTask>(), - is_cheap); + PostTask(make_scoped_ptr(new RasterWorkerPoolTaskImpl( + picture_pile, + is_cheap, + task, + reply)).PassAs<internal::WorkerPoolTask>()); } } // namespace cc |