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

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: Check and prevent worker pool reentrancy during dispatch of completion callbacks 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
« no previous file with comments | « cc/resources/raster_worker_pool.h ('k') | cc/resources/resource_provider.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..a078fb00bb7e9600e7408a10bd37c92b23a5d9fb 100644
--- a/cc/resources/raster_worker_pool.cc
+++ b/cc/resources/raster_worker_pool.cc
@@ -10,24 +10,72 @@ namespace cc {
namespace {
+class RasterWorkerPoolContainerTaskImpl : public internal::WorkerPoolTask {
+ public:
+ RasterWorkerPoolContainerTaskImpl(
+ internal::WorkerPoolTask::TaskVector* dependencies)
+ : internal::WorkerPoolTask(dependencies) {
+ }
+
+ // Overridden from internal::WorkerPoolTask:
+ virtual void RunOnThread(unsigned thread_index) OVERRIDE {}
+ virtual void DispatchCompletionCallback() OVERRIDE {}
+
+ private:
+ virtual ~RasterWorkerPoolContainerTaskImpl() {}
+};
+
class RasterWorkerPoolTaskImpl : public internal::WorkerPoolTask {
public:
- RasterWorkerPoolTaskImpl(PicturePileImpl* picture_pile,
- const RasterWorkerPool::RasterCallback& task,
- const base::Closure& reply)
- : internal::WorkerPoolTask(reply),
+ 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(!HasFinishedRunning());
+ }
+
+ 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,
+ internal::WorkerPoolTask::TaskVector* dependencies)
+ : internal::WorkerPoolTask(dependencies),
picture_pile_(picture_pile),
- task_(task) {
+ 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(!HasFinishedRunning());
}
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 +84,69 @@ const int kCheckForCompletedTasksDelayMs = 6;
} // namespace
-RasterWorkerPool::RasterWorkerPool(size_t num_threads)
- : WorkerPool(
- num_threads,
- base::TimeDelta::FromMilliseconds(kCheckForCompletedTasksDelayMs),
- kWorkerThreadNamePrefix) {
+RasterWorkerPool::Task::Queue::Queue() {
+}
+
+RasterWorkerPool::Task::Queue::~Queue() {
+}
+
+void RasterWorkerPool::Task::Queue::Append(const Task& task) {
+ DCHECK(!task.is_null());
+ tasks_.push_back(task.internal_);
+}
+
+RasterWorkerPool::Task::Task() {
+}
+
+RasterWorkerPool::Task::Task(const base::Closure& callback,
+ const Reply& reply)
+ : internal_(new RasterWorkerPoolTaskImpl(callback, reply)) {
+}
+
+RasterWorkerPool::Task::Task(Queue* dependencies)
+ : internal_(new RasterWorkerPoolContainerTaskImpl(&dependencies->tasks_)) {
+}
+
+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,
+ Task::Queue* dependencies)
+ : RasterWorkerPool::Task(
+ new RasterWorkerPoolPictureTaskImpl(picture_pile,
+ callback,
+ reply,
+ &dependencies->tasks_)) {
+}
+
+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.
+ WorkerPool::ScheduleTasks(NULL);
+
+ WorkerPool::Shutdown();
+}
+
+void RasterWorkerPool::ScheduleTasks(Task* task) {
+ WorkerPool::ScheduleTasks(task ? task->internal_ : NULL);
}
} // namespace cc
« 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