| Index: content/child/scheduler/prioritizing_task_queue_selector.cc
|
| diff --git a/content/child/scheduler/prioritizing_task_queue_selector.cc b/content/child/scheduler/prioritizing_task_queue_selector.cc
|
| deleted file mode 100644
|
| index 193e81ff106d9a5fc23404f1beb737e9e721e2cb..0000000000000000000000000000000000000000
|
| --- a/content/child/scheduler/prioritizing_task_queue_selector.cc
|
| +++ /dev/null
|
| @@ -1,192 +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/child/scheduler/prioritizing_task_queue_selector.h"
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/pending_task.h"
|
| -#include "base/trace_event/trace_event_argument.h"
|
| -
|
| -namespace content {
|
| -
|
| -PrioritizingTaskQueueSelector::PrioritizingTaskQueueSelector()
|
| - : starvation_count_(0), task_queue_selector_observer_(nullptr) {
|
| -}
|
| -
|
| -PrioritizingTaskQueueSelector::~PrioritizingTaskQueueSelector() {
|
| -}
|
| -
|
| -void PrioritizingTaskQueueSelector::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 PrioritizingTaskQueueSelector::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);
|
| - bool previously_enabled = DisableQueueInternal(queue_index);
|
| - queue_priorities_[priority].insert(queue_index);
|
| - if (task_queue_selector_observer_ && !previously_enabled)
|
| - task_queue_selector_observer_->OnTaskQueueEnabled();
|
| -}
|
| -
|
| -void PrioritizingTaskQueueSelector::EnableQueue(size_t queue_index,
|
| - QueuePriority priority) {
|
| - SetQueuePriority(queue_index, priority);
|
| -}
|
| -
|
| -void PrioritizingTaskQueueSelector::DisableQueue(size_t queue_index) {
|
| - DisableQueueInternal(queue_index);
|
| -}
|
| -
|
| -bool PrioritizingTaskQueueSelector::DisableQueueInternal(size_t queue_index) {
|
| - DCHECK(main_thread_checker_.CalledOnValidThread());
|
| - DCHECK_LT(queue_index, work_queues_.size());
|
| - bool previously_enabled = false;
|
| - for (auto& queue_priority : queue_priorities_) {
|
| - if (queue_priority.erase(queue_index))
|
| - previously_enabled = true;
|
| - }
|
| - return previously_enabled;
|
| -}
|
| -
|
| -bool PrioritizingTaskQueueSelector::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 PrioritizingTaskQueueSelector::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();
|
| -}
|
| -
|
| -PrioritizingTaskQueueSelector::QueuePriority
|
| -PrioritizingTaskQueueSelector::NextPriority(QueuePriority priority) {
|
| - DCHECK(priority < QUEUE_PRIORITY_COUNT);
|
| - return static_cast<QueuePriority>(static_cast<int>(priority) + 1);
|
| -}
|
| -
|
| -bool PrioritizingTaskQueueSelector::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 PrioritizingTaskQueueSelector::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 PrioritizingTaskQueueSelector::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* PrioritizingTaskQueueSelector::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 PrioritizingTaskQueueSelector::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_);
|
| -}
|
| -
|
| -void PrioritizingTaskQueueSelector::SetTaskQueueSelectorObserver(
|
| - Observer* observer) {
|
| - task_queue_selector_observer_ = observer;
|
| -}
|
| -
|
| -} // namespace content
|
|
|