| Index: content/renderer/scheduler/renderer_task_queue_selector.cc
|
| diff --git a/content/renderer/scheduler/renderer_task_queue_selector.cc b/content/renderer/scheduler/renderer_task_queue_selector.cc
|
| deleted file mode 100644
|
| index 7191942cd13ebb8c1c9a037190250236f646d60a..0000000000000000000000000000000000000000
|
| --- a/content/renderer/scheduler/renderer_task_queue_selector.cc
|
| +++ /dev/null
|
| @@ -1,177 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "content/renderer/scheduler/renderer_task_queue_selector.h"
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/pending_task.h"
|
| -#include "base/trace_event/trace_event_argument.h"
|
| -
|
| -namespace content {
|
| -
|
| -RendererTaskQueueSelector::RendererTaskQueueSelector() : starvation_count_(0) {
|
| -}
|
| -
|
| -RendererTaskQueueSelector::~RendererTaskQueueSelector() {
|
| -}
|
| -
|
| -void RendererTaskQueueSelector::RegisterWorkQueues(
|
| - const std::vector<const base::TaskQueue*>& work_queues) {
|
| - DCHECK(main_thread_checker_.CalledOnValidThread());
|
| - work_queues_ = work_queues;
|
| - for (auto& queue_priority : queue_priorities_) {
|
| - queue_priority.clear();
|
| - }
|
| -
|
| - // By default, all work queues are set to normal priority.
|
| - for (size_t i = 0; i < work_queues.size(); i++) {
|
| - queue_priorities_[NORMAL_PRIORITY].insert(i);
|
| - }
|
| -}
|
| -
|
| -void RendererTaskQueueSelector::SetQueuePriority(size_t queue_index,
|
| - QueuePriority priority) {
|
| - DCHECK(main_thread_checker_.CalledOnValidThread());
|
| - DCHECK_LT(queue_index, work_queues_.size());
|
| - DCHECK_LT(priority, QUEUE_PRIORITY_COUNT);
|
| - DisableQueue(queue_index);
|
| - queue_priorities_[priority].insert(queue_index);
|
| -}
|
| -
|
| -void RendererTaskQueueSelector::EnableQueue(size_t queue_index,
|
| - QueuePriority priority) {
|
| - SetQueuePriority(queue_index, priority);
|
| -}
|
| -
|
| -void RendererTaskQueueSelector::DisableQueue(size_t queue_index) {
|
| - DCHECK(main_thread_checker_.CalledOnValidThread());
|
| - DCHECK_LT(queue_index, work_queues_.size());
|
| - for (auto& queue_priority : queue_priorities_) {
|
| - queue_priority.erase(queue_index);
|
| - }
|
| -}
|
| -
|
| -bool RendererTaskQueueSelector::IsQueueEnabled(size_t queue_index) const {
|
| - DCHECK(main_thread_checker_.CalledOnValidThread());
|
| - DCHECK_LT(queue_index, work_queues_.size());
|
| - for (const auto& queue_priority : queue_priorities_) {
|
| - if (queue_priority.find(queue_index) != queue_priority.end())
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -bool RendererTaskQueueSelector::IsOlder(const base::TaskQueue* queueA,
|
| - const base::TaskQueue* queueB) {
|
| - // Note: the comparison is correct due to the fact that the PendingTask
|
| - // operator inverts its comparison operation in order to work well in a heap
|
| - // based priority queue.
|
| - return queueB->front() < queueA->front();
|
| -}
|
| -
|
| -RendererTaskQueueSelector::QueuePriority
|
| -RendererTaskQueueSelector::NextPriority(QueuePriority priority) {
|
| - DCHECK(priority < QUEUE_PRIORITY_COUNT);
|
| - return static_cast<QueuePriority>(static_cast<int>(priority) + 1);
|
| -}
|
| -
|
| -bool RendererTaskQueueSelector::ChooseOldestWithPriority(
|
| - QueuePriority priority,
|
| - size_t* out_queue_index) const {
|
| - bool found_non_empty_queue = false;
|
| - size_t chosen_queue = 0;
|
| - for (int queue_index : queue_priorities_[priority]) {
|
| - if (work_queues_[queue_index]->empty()) {
|
| - continue;
|
| - }
|
| - if (!found_non_empty_queue ||
|
| - IsOlder(work_queues_[queue_index], work_queues_[chosen_queue])) {
|
| - found_non_empty_queue = true;
|
| - chosen_queue = queue_index;
|
| - }
|
| - }
|
| -
|
| - if (found_non_empty_queue) {
|
| - *out_queue_index = chosen_queue;
|
| - }
|
| - return found_non_empty_queue;
|
| -}
|
| -
|
| -bool RendererTaskQueueSelector::SelectWorkQueueToService(
|
| - size_t* out_queue_index) {
|
| - DCHECK(main_thread_checker_.CalledOnValidThread());
|
| - DCHECK(work_queues_.size());
|
| - // Always service the control queue if it has any work.
|
| - if (ChooseOldestWithPriority(CONTROL_PRIORITY, out_queue_index)) {
|
| - DidSelectQueueWithPriority(CONTROL_PRIORITY);
|
| - return true;
|
| - }
|
| - // Select from the normal priority queue if we are starving it.
|
| - if (starvation_count_ >= kMaxStarvationTasks &&
|
| - ChooseOldestWithPriority(NORMAL_PRIORITY, out_queue_index)) {
|
| - DidSelectQueueWithPriority(NORMAL_PRIORITY);
|
| - return true;
|
| - }
|
| - // Otherwise choose in priority order.
|
| - for (QueuePriority priority = HIGH_PRIORITY; priority < QUEUE_PRIORITY_COUNT;
|
| - priority = NextPriority(priority)) {
|
| - if (ChooseOldestWithPriority(priority, out_queue_index)) {
|
| - DidSelectQueueWithPriority(priority);
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -void RendererTaskQueueSelector::DidSelectQueueWithPriority(
|
| - QueuePriority priority) {
|
| - switch (priority) {
|
| - case CONTROL_PRIORITY:
|
| - break;
|
| - case HIGH_PRIORITY:
|
| - starvation_count_++;
|
| - break;
|
| - case NORMAL_PRIORITY:
|
| - case BEST_EFFORT_PRIORITY:
|
| - starvation_count_ = 0;
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| -}
|
| -
|
| -// static
|
| -const char* RendererTaskQueueSelector::PriorityToString(
|
| - QueuePriority priority) {
|
| - switch (priority) {
|
| - case CONTROL_PRIORITY:
|
| - return "control";
|
| - case HIGH_PRIORITY:
|
| - return "high";
|
| - case NORMAL_PRIORITY:
|
| - return "normal";
|
| - case BEST_EFFORT_PRIORITY:
|
| - return "best_effort";
|
| - default:
|
| - NOTREACHED();
|
| - return nullptr;
|
| - }
|
| -}
|
| -
|
| -void RendererTaskQueueSelector::AsValueInto(
|
| - base::trace_event::TracedValue* state) const {
|
| - DCHECK(main_thread_checker_.CalledOnValidThread());
|
| - state->BeginDictionary("priorities");
|
| - for (QueuePriority priority = FIRST_QUEUE_PRIORITY;
|
| - priority < QUEUE_PRIORITY_COUNT; priority = NextPriority(priority)) {
|
| - state->BeginArray(PriorityToString(priority));
|
| - for (size_t queue_index : queue_priorities_[priority])
|
| - state->AppendInteger(queue_index);
|
| - state->EndArray();
|
| - }
|
| - state->EndDictionary();
|
| - state->SetInteger("starvation_count", starvation_count_);
|
| -}
|
| -
|
| -} // namespace content
|
|
|