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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: cc/resources/raster_worker_pool.cc
diff --git a/cc/resources/raster_worker_pool.cc b/cc/resources/raster_worker_pool.cc
index dba3fc2ba02d60d2d7b17715f0f5a131adf0446c..a5cac410e7d09a89189cc135284bbc2171028501 100644
--- a/cc/resources/raster_worker_pool.cc
+++ b/cc/resources/raster_worker_pool.cc
@@ -12,22 +12,53 @@ namespace {
class RasterWorkerPoolTaskImpl : public internal::WorkerPoolTask {
public:
- RasterWorkerPoolTaskImpl(PicturePileImpl* picture_pile,
- const RasterWorkerPool::RasterCallback& task,
- const base::Closure& reply)
- : internal::WorkerPoolTask(reply),
- picture_pile_(picture_pile),
- task_(task) {
+ RasterWorkerPoolTaskImpl(const base::Closure& callback,
+ const RasterWorkerPool::Task::Reply& reply)
+ : callback_(callback),
+ reply_(reply) {
+ }
+
+ // Overridden from internal::WorkerPoolTask:
+ virtual void RunOnThread(unsigned thread_index) OVERRIDE {
+ callback_.Run();
+ }
+ virtual void DispatchCompletionCallback() OVERRIDE {
+ reply_.Run(!HasFinished());
+ }
+
+ private:
+ virtual ~RasterWorkerPoolTaskImpl() {}
+
+ const base::Closure callback_;
+ const RasterWorkerPool::Task::Reply reply_;
+};
+
+class RasterWorkerPoolPictureTaskImpl : public internal::WorkerPoolTask {
+ public:
+ RasterWorkerPoolPictureTaskImpl(
+ PicturePileImpl* picture_pile,
+ const RasterWorkerPool::PictureTask::Callback& callback,
+ const RasterWorkerPool::Task::Reply& reply)
+ : picture_pile_(picture_pile),
+ callback_(callback),
+ reply_(reply) {
DCHECK(picture_pile_);
}
+ // Overridden from internal::WorkerPoolTask:
virtual void RunOnThread(unsigned thread_index) OVERRIDE {
- task_.Run(picture_pile_->GetCloneForDrawingOnThread(thread_index));
+ callback_.Run(picture_pile_->GetCloneForDrawingOnThread(thread_index));
+ }
+ virtual void DispatchCompletionCallback() OVERRIDE {
+ reply_.Run(!HasFinished());
}
private:
+ virtual ~RasterWorkerPoolPictureTaskImpl() {}
+
scoped_refptr<PicturePileImpl> picture_pile_;
- RasterWorkerPool::RasterCallback task_;
+ const RasterWorkerPool::PictureTask::Callback callback_;
+ const RasterWorkerPool::Task::Reply reply_;
};
const char* kWorkerThreadNamePrefix = "CompositorRaster";
@@ -36,23 +67,71 @@ const int kCheckForCompletedTasksDelayMs = 6;
} // namespace
-RasterWorkerPool::RasterWorkerPool(size_t num_threads)
- : WorkerPool(
- num_threads,
- base::TimeDelta::FromMilliseconds(kCheckForCompletedTasksDelayMs),
- kWorkerThreadNamePrefix) {
+RasterWorkerPool::Task::Schedule::Schedule() {
+}
+
+RasterWorkerPool::Task::Schedule::~Schedule() {
+}
+
+void RasterWorkerPool::Task::Schedule::Append(const Task& task) {
+ DCHECK(!task.is_null());
+ internal::WorkerPoolTaskDependency::Create(
+ task.internal_, &task_graph_, NULL);
+}
+
+void RasterWorkerPool::Task::Schedule::AppendWithDependencies(
+ const Task& task, Schedule* dependencies) {
+ DCHECK(!task.is_null());
+ internal::WorkerPoolTaskDependency::Create(
+ task.internal_, &task_graph_, &dependencies->task_graph_);
+}
+
+RasterWorkerPool::Task::Task() {
+}
+
+RasterWorkerPool::Task::Task(const base::Closure& callback,
+ const Reply& reply)
+ : internal_(new RasterWorkerPoolTaskImpl(callback, reply)) {
+}
+
+RasterWorkerPool::Task::Task(scoped_refptr<internal::WorkerPoolTask> internal)
+ : internal_(internal) {
+}
+
+RasterWorkerPool::Task::~Task() {
+}
+
+void RasterWorkerPool::Task::Reset() {
+ internal_ = NULL;
+}
+
+RasterWorkerPool::PictureTask::PictureTask(PicturePileImpl* picture_pile,
+ const Callback& callback,
+ const Reply& reply)
+ : RasterWorkerPool::Task(new RasterWorkerPoolPictureTaskImpl(picture_pile,
+ callback,
+ reply)) {
+}
+
+RasterWorkerPool::RasterWorkerPool(size_t num_threads) : WorkerPool(
+ num_threads,
+ base::TimeDelta::FromMilliseconds(kCheckForCompletedTasksDelayMs),
+ kWorkerThreadNamePrefix) {
}
RasterWorkerPool::~RasterWorkerPool() {
}
-void RasterWorkerPool::PostRasterTaskAndReply(PicturePileImpl* picture_pile,
- const RasterCallback& task,
- const base::Closure& reply) {
- PostTask(make_scoped_ptr(new RasterWorkerPoolTaskImpl(
- picture_pile,
- task,
- reply)).PassAs<internal::WorkerPoolTask>());
+void RasterWorkerPool::Shutdown() {
+ // Cancel all previously scheduled tasks.
+ Task::Schedule empty_schedule;
+ ScheduleTasks(&empty_schedule);
+
+ WorkerPool::Shutdown();
+}
+
+void RasterWorkerPool::ScheduleTasks(Task::Schedule* schedule) {
+ WorkerPool::ScheduleTasks(&schedule->task_graph_);
}
} // namespace cc

Powered by Google App Engine
This is Rietveld 408576698