Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(41)

Side by Side Diff: cc/resources/raster_worker_pool.cc

Issue 14689004: Re-land: cc: Cancel and re-prioritize worker pool tasks. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added support for dependencies and tests. Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/resources/raster_worker_pool.h" 5 #include "cc/resources/raster_worker_pool.h"
6 6
7 #include "cc/resources/picture_pile_impl.h" 7 #include "cc/resources/picture_pile_impl.h"
8 8
9 namespace cc { 9 namespace cc {
10 10
11 namespace { 11 namespace {
12 12
13 class RasterWorkerPoolTaskImpl : public internal::WorkerPoolTask { 13 class RasterWorkerPoolTaskImpl : public internal::WorkerPoolTask {
14 public: 14 public:
15 RasterWorkerPoolTaskImpl(PicturePileImpl* picture_pile, 15 RasterWorkerPoolTaskImpl(const base::Closure& callback,
16 const RasterWorkerPool::RasterCallback& task, 16 const RasterWorkerPool::Task::Reply& reply)
17 const base::Closure& reply) 17 : callback_(callback),
18 : internal::WorkerPoolTask(reply), 18 reply_(reply) {
19 picture_pile_(picture_pile), 19 }
20 task_(task) { 20
21 // Overridden from internal::WorkerPoolTask:
22 virtual void RunOnThread(unsigned thread_index) OVERRIDE {
23 callback_.Run();
24 }
25 virtual void DispatchCompletionCallback() OVERRIDE {
26 reply_.Run(!HasFinished());
27 }
28
29 private:
30 virtual ~RasterWorkerPoolTaskImpl() {}
31
32 const base::Closure callback_;
33 const RasterWorkerPool::Task::Reply reply_;
34 };
35
36 class RasterWorkerPoolPictureTaskImpl : public internal::WorkerPoolTask {
37 public:
38 RasterWorkerPoolPictureTaskImpl(
39 PicturePileImpl* picture_pile,
40 const RasterWorkerPool::PictureTask::Callback& callback,
41 const RasterWorkerPool::Task::Reply& reply)
42 : picture_pile_(picture_pile),
43 callback_(callback),
44 reply_(reply) {
21 DCHECK(picture_pile_); 45 DCHECK(picture_pile_);
22 } 46 }
23 47
48 // Overridden from internal::WorkerPoolTask:
24 virtual void RunOnThread(unsigned thread_index) OVERRIDE { 49 virtual void RunOnThread(unsigned thread_index) OVERRIDE {
25 task_.Run(picture_pile_->GetCloneForDrawingOnThread(thread_index)); 50 callback_.Run(picture_pile_->GetCloneForDrawingOnThread(thread_index));
51 }
52 virtual void DispatchCompletionCallback() OVERRIDE {
53 reply_.Run(!HasFinished());
26 } 54 }
27 55
28 private: 56 private:
57 virtual ~RasterWorkerPoolPictureTaskImpl() {}
58
29 scoped_refptr<PicturePileImpl> picture_pile_; 59 scoped_refptr<PicturePileImpl> picture_pile_;
30 RasterWorkerPool::RasterCallback task_; 60 const RasterWorkerPool::PictureTask::Callback callback_;
61 const RasterWorkerPool::Task::Reply reply_;
31 }; 62 };
32 63
33 const char* kWorkerThreadNamePrefix = "CompositorRaster"; 64 const char* kWorkerThreadNamePrefix = "CompositorRaster";
34 65
35 const int kCheckForCompletedTasksDelayMs = 6; 66 const int kCheckForCompletedTasksDelayMs = 6;
36 67
37 } // namespace 68 } // namespace
38 69
39 RasterWorkerPool::RasterWorkerPool(size_t num_threads) 70 RasterWorkerPool::Task::Schedule::Schedule() {
40 : WorkerPool( 71 }
41 num_threads, 72
42 base::TimeDelta::FromMilliseconds(kCheckForCompletedTasksDelayMs), 73 RasterWorkerPool::Task::Schedule::~Schedule() {
43 kWorkerThreadNamePrefix) { 74 }
75
76 void RasterWorkerPool::Task::Schedule::Append(const Task& task) {
77 DCHECK(!task.is_null());
78 internal::WorkerPoolTaskDependency::Create(
79 task.internal_, &task_graph_, NULL);
80 }
81
82 void RasterWorkerPool::Task::Schedule::AppendWithDependencies(
83 const Task& task, Schedule* dependencies) {
84 DCHECK(!task.is_null());
85 internal::WorkerPoolTaskDependency::Create(
86 task.internal_, &task_graph_, &dependencies->task_graph_);
87 }
88
89 RasterWorkerPool::Task::Task() {
90 }
91
92 RasterWorkerPool::Task::Task(const base::Closure& callback,
93 const Reply& reply)
94 : internal_(new RasterWorkerPoolTaskImpl(callback, reply)) {
95 }
96
97 RasterWorkerPool::Task::Task(scoped_refptr<internal::WorkerPoolTask> internal)
98 : internal_(internal) {
99 }
100
101 RasterWorkerPool::Task::~Task() {
102 }
103
104 void RasterWorkerPool::Task::Reset() {
105 internal_ = NULL;
106 }
107
108 RasterWorkerPool::PictureTask::PictureTask(PicturePileImpl* picture_pile,
109 const Callback& callback,
110 const Reply& reply)
111 : RasterWorkerPool::Task(new RasterWorkerPoolPictureTaskImpl(picture_pile,
112 callback,
113 reply)) {
114 }
115
116 RasterWorkerPool::RasterWorkerPool(size_t num_threads) : WorkerPool(
117 num_threads,
118 base::TimeDelta::FromMilliseconds(kCheckForCompletedTasksDelayMs),
119 kWorkerThreadNamePrefix) {
44 } 120 }
45 121
46 RasterWorkerPool::~RasterWorkerPool() { 122 RasterWorkerPool::~RasterWorkerPool() {
47 } 123 }
48 124
49 void RasterWorkerPool::PostRasterTaskAndReply(PicturePileImpl* picture_pile, 125 void RasterWorkerPool::Shutdown() {
50 const RasterCallback& task, 126 // Cancel all previously scheduled tasks.
51 const base::Closure& reply) { 127 Task::Schedule empty_schedule;
52 PostTask(make_scoped_ptr(new RasterWorkerPoolTaskImpl( 128 ScheduleTasks(&empty_schedule);
53 picture_pile, 129
54 task, 130 WorkerPool::Shutdown();
55 reply)).PassAs<internal::WorkerPoolTask>()); 131 }
132
133 void RasterWorkerPool::ScheduleTasks(Task::Schedule* schedule) {
134 WorkerPool::ScheduleTasks(&schedule->task_graph_);
56 } 135 }
57 136
58 } // namespace cc 137 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698