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

Unified Diff: cc/worker_pool.cc

Issue 12217105: cc: Check for completed raster tasks at interval. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 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
« cc/tile_manager.cc ('K') | « cc/worker_pool.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/worker_pool.cc
diff --git a/cc/worker_pool.cc b/cc/worker_pool.cc
index 7d3428aa74d2f8bde286b73cb418549fb1504a70..c1a70ce8a655821a20eed4ae708e79a5f0a84269 100644
--- a/cc/worker_pool.cc
+++ b/cc/worker_pool.cc
@@ -28,6 +28,7 @@ class WorkerPoolTaskImpl : public internal::WorkerPoolTask {
virtual void Run(RenderingStats* rendering_stats) OVERRIDE {
task_.Run(rendering_stats);
+ base::subtle::NoBarrier_Store(&completed_, 1);
brianderson 2013/02/12 01:44:31 I think you need a barrier before this store (or a
reveman 2013/02/12 02:29:52 Done.
}
private:
@@ -36,22 +37,24 @@ class WorkerPoolTaskImpl : public internal::WorkerPoolTask {
const char* kWorkerThreadNamePrefix = "Compositor";
-// Allow two pending tasks per worker. This keeps resource usage
-// low while making sure workers aren't unnecessarily idle.
-const int kNumPendingTasksPerWorker = 2;
-
} // namespace
namespace internal {
WorkerPoolTask::WorkerPoolTask(const base::Closure& reply)
: reply_(reply) {
+ base::subtle::NoBarrier_Store(&completed_, 0);
brianderson 2013/02/12 01:44:31 I think you need a barrier after this store (or an
reveman 2013/02/12 02:29:52 Done.
}
WorkerPoolTask::~WorkerPoolTask() {
}
+bool WorkerPoolTask::IsPending() {
+ return base::subtle::NoBarrier_Load(&completed_) == 0;
+}
+
void WorkerPoolTask::Completed() {
+ DCHECK_EQ(base::subtle::NoBarrier_Load(&completed_), 1);
reply_.Run();
}
@@ -60,7 +63,6 @@ void WorkerPoolTask::Completed() {
WorkerPool::Worker::Worker(WorkerPool* worker_pool, const std::string name)
: base::Thread(name.c_str()),
worker_pool_(worker_pool),
- weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
rendering_stats_(make_scoped_ptr(new RenderingStats)),
record_rendering_stats_(false) {
Start();
@@ -80,23 +82,17 @@ void WorkerPool::Worker::StopAfterCompletingAllPendingTasks() {
// all tasks have finished running.
while (!pending_tasks_.empty())
OnTaskCompleted();
-
- // Cancel all pending replies.
- weak_ptr_factory_.InvalidateWeakPtrs();
}
void WorkerPool::Worker::PostTask(scoped_ptr<internal::WorkerPoolTask> task) {
- DCHECK_LT(num_pending_tasks(), kNumPendingTasksPerWorker);
-
RenderingStats* stats =
record_rendering_stats_ ? rendering_stats_.get() : NULL;
- message_loop_proxy()->PostTaskAndReply(
+ message_loop_proxy()->PostTask(
FROM_HERE,
base::Bind(&Worker::RunTask,
base::Unretained(task.get()),
- base::Unretained(stats)),
- base::Bind(&Worker::OnTaskCompleted, weak_ptr_factory_.GetWeakPtr()));
+ base::Unretained(stats)));
pending_tasks_.push_back(task.Pass());
@@ -126,6 +122,15 @@ void WorkerPool::Worker::OnTaskCompleted() {
worker_pool_->DidNumPendingTasksChange();
}
+void WorkerPool::Worker::CheckForCompletedTasks() {
+ while (!pending_tasks_.empty()) {
+ if (pending_tasks_.front()->IsPending())
+ return;
+
+ OnTaskCompleted();
+ }
+}
+
WorkerPool::WorkerPool(size_t num_threads)
: workers_need_sorting_(false),
shutdown_(false) {
@@ -164,10 +169,12 @@ void WorkerPool::PostTaskAndReply(
reply)).PassAs<internal::WorkerPoolTask>());
}
-bool WorkerPool::IsBusy() {
- Worker* worker = GetWorkerForNextTask();
-
- return worker->num_pending_tasks() >= kNumPendingTasksPerWorker;
+void WorkerPool::CheckForCompletedTasks() {
+ for (WorkerVector::iterator it = workers_.begin();
+ it != workers_.end(); it++) {
+ Worker* worker = *it;
+ worker->CheckForCompletedTasks();
+ }
}
void WorkerPool::SetRecordRenderingStats(bool record_rendering_stats) {
« cc/tile_manager.cc ('K') | « cc/worker_pool.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698