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

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: move alignment check to RP 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::RasterWorkerPoolTask {
14 public: 14 public:
15 RasterWorkerPoolTaskImpl(PicturePileImpl* picture_pile, 15 RasterWorkerPoolTaskImpl(const base::Closure& callback,
16 const RasterWorkerPool::RasterCallback& task, 16 const internal::RasterWorkerPoolTask::Reply& reply)
17 const base::Closure& reply) 17 : internal::RasterWorkerPoolTask(reply),
18 : internal::WorkerPoolTask(reply), 18 callback_(callback) {
19 }
20
21 // Overridden from internal::WorkerPoolTask:
22 virtual void RunOnThread(unsigned thread_index) OVERRIDE {
23 WillRun();
24 callback_.Run();
25 DidRun();
26 }
27
28 private:
29 virtual ~RasterWorkerPoolTaskImpl() {}
30
31 const base::Closure callback_;
32 };
33
34 class RasterWorkerPoolPictureTaskImpl : public internal::RasterWorkerPoolTask {
35 public:
36 RasterWorkerPoolPictureTaskImpl(
37 PicturePileImpl* picture_pile,
38 const RasterWorkerPool::PictureTask::Callback& callback,
39 const internal::RasterWorkerPoolTask::Reply& reply)
40 : internal::RasterWorkerPoolTask(reply),
19 picture_pile_(picture_pile), 41 picture_pile_(picture_pile),
20 task_(task) { 42 callback_(callback) {
21 DCHECK(picture_pile_); 43 DCHECK(picture_pile_);
22 } 44 }
23 45
46 // Overridden from internal::WorkerPoolTask:
24 virtual void RunOnThread(unsigned thread_index) OVERRIDE { 47 virtual void RunOnThread(unsigned thread_index) OVERRIDE {
25 task_.Run(picture_pile_->GetCloneForDrawingOnThread(thread_index)); 48 WillRun();
49 callback_.Run(picture_pile_->GetCloneForDrawingOnThread(thread_index));
vmpstr 2013/05/06 23:08:48 It's a bit unfortunate that we have to specialize
reveman 2013/05/07 01:33:54 I'd rather not expose the thread id. Also there's
50 DidRun();
26 } 51 }
27 52
28 private: 53 private:
54 virtual ~RasterWorkerPoolPictureTaskImpl() {}
55
29 scoped_refptr<PicturePileImpl> picture_pile_; 56 scoped_refptr<PicturePileImpl> picture_pile_;
30 RasterWorkerPool::RasterCallback task_; 57 RasterWorkerPool::PictureTask::Callback callback_;
58 };
59
60 class RasterWorkerPoolTaskQueueImpl : public internal::WorkerPoolTaskGraph {
61 public:
62 typedef std::deque<scoped_refptr<internal::RasterWorkerPoolTask> > TaskDeque;
63
64 explicit RasterWorkerPoolTaskQueueImpl(TaskDeque* tasks) {
65 tasks->swap(tasks_);
66 }
67 virtual ~RasterWorkerPoolTaskQueueImpl() {}
68
69 // Overridden from internal::WorkerPoolTaskGraph:
70 virtual bool HasMoreTasks() OVERRIDE {
71 return !tasks_.empty();
72 }
73 virtual bool HasTask(internal::WorkerPoolTask* task) OVERRIDE {
74 // TODO(reveman): Use hash if size of |tasks_| gets large.
75 return std::find(tasks_.begin(), tasks_.end(), task) != tasks_.end();
76 }
77 virtual internal::WorkerPoolTask* TopTask() OVERRIDE {
78 return tasks_.front();
79 }
80 virtual scoped_refptr<internal::WorkerPoolTask> TakeTask(
81 internal::WorkerPoolTask* task) OVERRIDE {
82 scoped_refptr<internal::WorkerPoolTask> reference = task;
83
84 // Note: This is efficient when removing the top task, which is
85 // the most common use case of TakeTask().
86 TaskDeque::iterator it = std::find(tasks_.begin(), tasks_.end(), task);
87 DCHECK(it != tasks_.end());
88 tasks_.erase(it);
89
90 return reference;
91 }
92
93 private:
94 TaskDeque tasks_;
31 }; 95 };
32 96
33 const char* kWorkerThreadNamePrefix = "CompositorRaster"; 97 const char* kWorkerThreadNamePrefix = "CompositorRaster";
34 98
35 const int kCheckForCompletedTasksDelayMs = 6; 99 const int kCheckForCompletedTasksDelayMs = 6;
36 100
37 } // namespace 101 } // namespace
38 102
103 namespace internal {
104
105 RasterWorkerPoolTask::RasterWorkerPoolTask(const Reply& reply)
106 : reply_(reply),
107 did_schedule_(false),
108 did_run_(false),
109 did_complete_(false) {
110 }
111
112 RasterWorkerPoolTask::~RasterWorkerPoolTask() {
113 DCHECK_EQ(did_schedule_, did_complete_);
114 DCHECK(!did_run_ || did_schedule_);
115 DCHECK(!did_run_ || did_complete_);
116 }
117
118 void RasterWorkerPoolTask::DispatchCompletionCallback() {
119 DCHECK(did_schedule_);
120 DCHECK(!did_complete_);
121 did_complete_ = true;
122 reply_.Run(!did_run_);
123 }
124
125 void RasterWorkerPoolTask::DidSchedule() {
126 DCHECK(!did_complete_);
127 did_schedule_ = true;
128 }
129
130 void RasterWorkerPoolTask::WillRun() {
131 DCHECK(!did_complete_);
132 DCHECK(!did_run_);
133 }
134
135 void RasterWorkerPoolTask::DidRun() {
136 did_run_ = true;
137 }
138
139 } // namespace internal
140
141 RasterWorkerPool::Task::Queue::Queue() {
142 }
143
144 RasterWorkerPool::Task::Queue::~Queue() {
145 }
146
147 void RasterWorkerPool::Task::Queue::Append(const Task& task) {
148 DCHECK(!task.is_null());
149 DCHECK(std::find(tasks_.begin(),
150 tasks_.end(),
151 task.internal_) == tasks_.end());
152 tasks_.push_back(task.internal_);
153 }
154
155 RasterWorkerPool::Task::Task() {
156 }
157
158 RasterWorkerPool::Task::Task(const base::Closure& callback,
159 const Reply& reply)
160 : internal_(new RasterWorkerPoolTaskImpl(callback, reply)) {
161 }
162
163 RasterWorkerPool::Task::Task(
164 scoped_refptr<internal::RasterWorkerPoolTask> internal)
165 : internal_(internal) {
166 }
167
168 RasterWorkerPool::Task::~Task() {
169 }
170
171 void RasterWorkerPool::Task::Reset() {
172 internal_ = NULL;
173 }
174
175 RasterWorkerPool::PictureTask::PictureTask(PicturePileImpl* picture_pile,
176 const Callback& callback,
177 const Reply& reply)
178 : RasterWorkerPool::Task(new RasterWorkerPoolPictureTaskImpl(picture_pile,
179 callback,
180 reply)) {
181 }
182
39 RasterWorkerPool::RasterWorkerPool( 183 RasterWorkerPool::RasterWorkerPool(
40 WorkerPoolClient* client, size_t num_threads) : WorkerPool( 184 WorkerPoolClient* client, size_t num_threads) : WorkerPool(
41 client, 185 client,
42 num_threads, 186 num_threads,
43 base::TimeDelta::FromMilliseconds(kCheckForCompletedTasksDelayMs), 187 base::TimeDelta::FromMilliseconds(kCheckForCompletedTasksDelayMs),
44 kWorkerThreadNamePrefix) { 188 kWorkerThreadNamePrefix) {
45 } 189 }
46 190
47 RasterWorkerPool::~RasterWorkerPool() { 191 RasterWorkerPool::~RasterWorkerPool() {
48 } 192 }
49 193
50 void RasterWorkerPool::PostRasterTaskAndReply(PicturePileImpl* picture_pile, 194 void RasterWorkerPool::ScheduleTasks(Task::Queue* queue) {
51 const RasterCallback& task, 195 // Note: DidSchedule() is only used for DCHECKs.
vmpstr 2013/05/06 23:08:48 If we're only doing these for DCHECKs, is it worth
reveman 2013/05/07 01:33:54 we could #if !defined(NDEBUG) all this stuff but a
52 const base::Closure& reply) { 196 for (Task::Queue::Deque::iterator it = queue->tasks_.begin();
53 PostTask(make_scoped_ptr(new RasterWorkerPoolTaskImpl( 197 it != queue->tasks_.end();
54 picture_pile, 198 ++it) {
55 task, 199 internal::RasterWorkerPoolTask* task = *it;
56 reply)).PassAs<internal::WorkerPoolTask>()); 200 task->DidSchedule();
201 }
202
203 WorkerPool::ScheduleTasks(
204 make_scoped_ptr(
205 new RasterWorkerPoolTaskQueueImpl(
206 &queue->tasks_)).PassAs<internal::WorkerPoolTaskGraph>());
57 } 207 }
58 208
59 } // namespace cc 209 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698