Index: content/renderer/raster_worker_pool.cc |
diff --git a/content/renderer/raster_worker_pool.cc b/content/renderer/raster_worker_pool.cc |
index e8ed13bf8cad0012e91abc13f9b2d6d3b23b117a..f9ecdcb7981c8331ee7a67610d741d6a376dee06 100644 |
--- a/content/renderer/raster_worker_pool.cc |
+++ b/content/renderer/raster_worker_pool.cc |
@@ -19,19 +19,29 @@ namespace { |
// A thread which forwards to RasterWorkerPool::Run with the runnable |
// categories. |
-class RasterWorkerPoolThread : public base::SimpleThread { |
+class RasterWorkerPoolThread : public base::DynamicPriorityThread, |
+ public cc::TaskWorker { |
public: |
- RasterWorkerPoolThread(const std::string& name_prefix, |
+ RasterWorkerPoolThread(const DynamicPriorityThread::PrioritySet& priorities, |
+ const std::string& name_prefix, |
const Options& options, |
RasterWorkerPool* pool, |
std::vector<cc::TaskCategory> categories, |
base::ConditionVariable* has_ready_to_run_tasks_cv) |
- : SimpleThread(name_prefix, options), |
+ : DynamicPriorityThread(priorities, name_prefix, options), |
pool_(pool), |
categories_(categories), |
has_ready_to_run_tasks_cv_(has_ready_to_run_tasks_cv) {} |
- void Run() override { pool_->Run(categories_, has_ready_to_run_tasks_cv_); } |
+ // Overridden from cc::TaskWorker: |
+ bool TaskSpeedup() override { Speedup(); } |
+ bool TaskSlowdown() override { SlowDown(); } |
+ bool TaskDone() override { RestoreDefaultPriority(); } |
+ |
+ // Overridden from base::DynamicPriorityThread: |
+ void Run() override { |
+ pool_->Run(this, categories_, has_ready_to_run_tasks_cv_); |
+ } |
private: |
RasterWorkerPool* const pool_; |
@@ -41,6 +51,24 @@ class RasterWorkerPoolThread : public base::SimpleThread { |
} // namespace |
+void RasterWorkerPool::AdjustWorkerPriorityForTask(cc::Task* task, |
+ uint16_t old_category, |
+ uint16_t new_category) { |
+ if (old_category == new_category) |
+ return; |
+ |
+ // TODO(prashant.n): Handle slowing down of tasks either by setting background |
+ // priority for worker OR cancelling the task. |
+ if (new_category == cc::TASK_CATEGORY_NONCONCURRENT_FOREGROUND || |
+ new_category == cc::TASK_CATEGORY_FOREGROUND) { |
+ if (task->GetWorker()->TaskSpeedup()) { |
+ // LOG(ERROR) << "\nPRAS:: [" << std::hex << runner << "] " |
+ // << runner->GetPrioritySetForDebugging() |
+ // << ". Runner speeded up ^^^^^^^^^"; |
+ } |
+ } |
+} |
+ |
// A sequenced task runner which posts tasks to a RasterWorkerPool. |
class RasterWorkerPool::RasterWorkerPoolSequencedTaskRunner |
: public base::SequencedTaskRunner { |
@@ -118,7 +146,8 @@ class RasterWorkerPool::RasterWorkerPoolSequencedTaskRunner |
}; |
RasterWorkerPool::RasterWorkerPool() |
- : namespace_token_(GetNamespaceToken()), |
+ : work_queue_(this), |
+ namespace_token_(GetNamespaceToken()), |
has_ready_to_run_foreground_tasks_cv_(&lock_), |
has_ready_to_run_background_tasks_cv_(&lock_), |
has_namespaces_with_finished_running_tasks_cv_(&lock_), |
@@ -133,8 +162,18 @@ void RasterWorkerPool::Start(int num_threads) { |
foreground_categories.push_back(cc::TASK_CATEGORY_NONCONCURRENT_FOREGROUND); |
foreground_categories.push_back(cc::TASK_CATEGORY_FOREGROUND); |
+ base::DynamicPriorityThread::PrioritySet only_foreground( |
+ base::ThreadPriority::NORMAL, base::ThreadPriority::NORMAL, |
+ base::ThreadPriority::NORMAL); |
+ |
+ base::DynamicPriorityThread::PrioritySet dynamic_background( |
+ base::ThreadPriority::BACKGROUND, base::ThreadPriority::BACKGROUND, |
+ base::ThreadPriority::NORMAL); |
+ |
+ // Create N normal priority threads and 1 background priority dynamic thread. |
for (int i = 0; i < num_threads; i++) { |
scoped_ptr<base::SimpleThread> thread(new RasterWorkerPoolThread( |
+ only_foreground, |
base::StringPrintf("CompositorTileWorker%u", |
static_cast<unsigned>(threads_.size() + 1)) |
.c_str(), |
@@ -155,6 +194,7 @@ void RasterWorkerPool::Start(int num_threads) { |
#endif |
scoped_ptr<base::SimpleThread> thread(new RasterWorkerPoolThread( |
+ dynamic_background, |
base::StringPrintf("CompositorTileWorker%u", |
static_cast<unsigned>(threads_.size() + 1)) |
.c_str(), |
@@ -225,12 +265,13 @@ bool RasterWorkerPool::RunsTasksOnCurrentThread() const { |
return true; |
} |
-void RasterWorkerPool::Run(const std::vector<cc::TaskCategory>& categories, |
+void RasterWorkerPool::Run(cc::TaskWorker* worker, |
+ const std::vector<cc::TaskCategory>& categories, |
base::ConditionVariable* has_ready_to_run_tasks_cv) { |
base::AutoLock lock(lock_); |
while (true) { |
- if (!RunTaskWithLockAcquired(categories)) { |
+ if (!RunTaskWithLockAcquired(worker, categories)) { |
// We are no longer running tasks, which may allow another category to |
// start running. Signal other worker threads. |
SignalHasReadyToRunTasksWithLockAcquired(); |
@@ -318,7 +359,6 @@ void RasterWorkerPool::CollectCompletedTasks( |
cc::Task::Vector* completed_tasks) { |
TRACE_EVENT0("disabled-by-default-cc.debug", |
"RasterWorkerPool::CollectCompletedTasks"); |
- |
{ |
base::AutoLock lock(lock_); |
CollectCompletedTasksWithLockAcquired(token, completed_tasks); |
@@ -333,10 +373,11 @@ void RasterWorkerPool::CollectCompletedTasksWithLockAcquired( |
} |
bool RasterWorkerPool::RunTaskWithLockAcquired( |
+ cc::TaskWorker* worker, |
const std::vector<cc::TaskCategory>& categories) { |
for (const auto& category : categories) { |
if (ShouldRunTaskForCategoryWithLockAcquired(category)) { |
- RunTaskInCategoryWithLockAcquired(category); |
+ RunTaskInCategoryWithLockAcquired(worker, category); |
return true; |
} |
} |
@@ -344,6 +385,7 @@ bool RasterWorkerPool::RunTaskWithLockAcquired( |
} |
void RasterWorkerPool::RunTaskInCategoryWithLockAcquired( |
+ cc::TaskWorker* worker, |
cc::TaskCategory category) { |
TRACE_EVENT0("toplevel", "TaskGraphRunner::RunTask"); |
@@ -352,6 +394,9 @@ void RasterWorkerPool::RunTaskInCategoryWithLockAcquired( |
auto prioritized_task = work_queue_.GetNextTaskToRun(category); |
cc::Task* task = prioritized_task.task; |
+ // Attach the worker to the task. |
+ AutoDetachTaskWorker task_worker(task, worker); |
+ |
// There may be more work available, so wake up another worker thread. |
SignalHasReadyToRunTasksWithLockAcquired(); |