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

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: Check and prevent worker pool reentrancy during dispatch of completion callbacks Created 7 years, 6 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
« no previous file with comments | « cc/resources/raster_worker_pool.h ('k') | cc/resources/resource_provider.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 RasterWorkerPoolContainerTaskImpl : public internal::WorkerPoolTask {
14 public:
15 RasterWorkerPoolContainerTaskImpl(
16 internal::WorkerPoolTask::TaskVector* dependencies)
17 : internal::WorkerPoolTask(dependencies) {
18 }
19
20 // Overridden from internal::WorkerPoolTask:
21 virtual void RunOnThread(unsigned thread_index) OVERRIDE {}
22 virtual void DispatchCompletionCallback() OVERRIDE {}
23
24 private:
25 virtual ~RasterWorkerPoolContainerTaskImpl() {}
26 };
27
13 class RasterWorkerPoolTaskImpl : public internal::WorkerPoolTask { 28 class RasterWorkerPoolTaskImpl : public internal::WorkerPoolTask {
14 public: 29 public:
15 RasterWorkerPoolTaskImpl(PicturePileImpl* picture_pile, 30 RasterWorkerPoolTaskImpl(const base::Closure& callback,
16 const RasterWorkerPool::RasterCallback& task, 31 const RasterWorkerPool::Task::Reply& reply)
17 const base::Closure& reply) 32 : callback_(callback),
18 : internal::WorkerPoolTask(reply), 33 reply_(reply) {
34 }
35
36 // Overridden from internal::WorkerPoolTask:
37 virtual void RunOnThread(unsigned thread_index) OVERRIDE {
38 callback_.Run();
39 }
40 virtual void DispatchCompletionCallback() OVERRIDE {
41 reply_.Run(!HasFinishedRunning());
42 }
43
44 private:
45 virtual ~RasterWorkerPoolTaskImpl() {}
46
47 const base::Closure callback_;
48 const RasterWorkerPool::Task::Reply reply_;
49 };
50
51 class RasterWorkerPoolPictureTaskImpl : public internal::WorkerPoolTask {
52 public:
53 RasterWorkerPoolPictureTaskImpl(
54 PicturePileImpl* picture_pile,
55 const RasterWorkerPool::PictureTask::Callback& callback,
56 const RasterWorkerPool::Task::Reply& reply,
57 internal::WorkerPoolTask::TaskVector* dependencies)
58 : internal::WorkerPoolTask(dependencies),
19 picture_pile_(picture_pile), 59 picture_pile_(picture_pile),
20 task_(task) { 60 callback_(callback),
61 reply_(reply) {
21 DCHECK(picture_pile_); 62 DCHECK(picture_pile_);
22 } 63 }
23 64
65 // Overridden from internal::WorkerPoolTask:
24 virtual void RunOnThread(unsigned thread_index) OVERRIDE { 66 virtual void RunOnThread(unsigned thread_index) OVERRIDE {
25 task_.Run(picture_pile_->GetCloneForDrawingOnThread(thread_index)); 67 callback_.Run(picture_pile_->GetCloneForDrawingOnThread(thread_index));
68 }
69 virtual void DispatchCompletionCallback() OVERRIDE {
70 reply_.Run(!HasFinishedRunning());
26 } 71 }
27 72
28 private: 73 private:
74 virtual ~RasterWorkerPoolPictureTaskImpl() {}
75
29 scoped_refptr<PicturePileImpl> picture_pile_; 76 scoped_refptr<PicturePileImpl> picture_pile_;
30 RasterWorkerPool::RasterCallback task_; 77 const RasterWorkerPool::PictureTask::Callback callback_;
78 const RasterWorkerPool::Task::Reply reply_;
31 }; 79 };
32 80
33 const char* kWorkerThreadNamePrefix = "CompositorRaster"; 81 const char* kWorkerThreadNamePrefix = "CompositorRaster";
34 82
35 const int kCheckForCompletedTasksDelayMs = 6; 83 const int kCheckForCompletedTasksDelayMs = 6;
36 84
37 } // namespace 85 } // namespace
38 86
39 RasterWorkerPool::RasterWorkerPool(size_t num_threads) 87 RasterWorkerPool::Task::Queue::Queue() {
40 : WorkerPool( 88 }
41 num_threads, 89
42 base::TimeDelta::FromMilliseconds(kCheckForCompletedTasksDelayMs), 90 RasterWorkerPool::Task::Queue::~Queue() {
43 kWorkerThreadNamePrefix) { 91 }
92
93 void RasterWorkerPool::Task::Queue::Append(const Task& task) {
94 DCHECK(!task.is_null());
95 tasks_.push_back(task.internal_);
96 }
97
98 RasterWorkerPool::Task::Task() {
99 }
100
101 RasterWorkerPool::Task::Task(const base::Closure& callback,
102 const Reply& reply)
103 : internal_(new RasterWorkerPoolTaskImpl(callback, reply)) {
104 }
105
106 RasterWorkerPool::Task::Task(Queue* dependencies)
107 : internal_(new RasterWorkerPoolContainerTaskImpl(&dependencies->tasks_)) {
108 }
109
110 RasterWorkerPool::Task::Task(scoped_refptr<internal::WorkerPoolTask> internal)
111 : internal_(internal) {
112 }
113
114 RasterWorkerPool::Task::~Task() {
115 }
116
117 void RasterWorkerPool::Task::Reset() {
118 internal_ = NULL;
119 }
120
121 RasterWorkerPool::PictureTask::PictureTask(PicturePileImpl* picture_pile,
122 const Callback& callback,
123 const Reply& reply,
124 Task::Queue* dependencies)
125 : RasterWorkerPool::Task(
126 new RasterWorkerPoolPictureTaskImpl(picture_pile,
127 callback,
128 reply,
129 &dependencies->tasks_)) {
130 }
131
132 RasterWorkerPool::RasterWorkerPool(size_t num_threads) : WorkerPool(
133 num_threads,
134 base::TimeDelta::FromMilliseconds(kCheckForCompletedTasksDelayMs),
135 kWorkerThreadNamePrefix) {
44 } 136 }
45 137
46 RasterWorkerPool::~RasterWorkerPool() { 138 RasterWorkerPool::~RasterWorkerPool() {
47 } 139 }
48 140
49 void RasterWorkerPool::PostRasterTaskAndReply(PicturePileImpl* picture_pile, 141 void RasterWorkerPool::Shutdown() {
50 const RasterCallback& task, 142 // Cancel all previously scheduled tasks.
51 const base::Closure& reply) { 143 WorkerPool::ScheduleTasks(NULL);
52 PostTask(make_scoped_ptr(new RasterWorkerPoolTaskImpl( 144
53 picture_pile, 145 WorkerPool::Shutdown();
54 task, 146 }
55 reply)).PassAs<internal::WorkerPoolTask>()); 147
148 void RasterWorkerPool::ScheduleTasks(Task* task) {
149 WorkerPool::ScheduleTasks(task ? task->internal_ : NULL);
56 } 150 }
57 151
58 } // namespace cc 152 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/raster_worker_pool.h ('k') | cc/resources/resource_provider.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698