Chromium Code Reviews| 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 |
| index c804437bd4103c7124b3cece692bda1dbcbdceae..b8a979ad86942d435f9308c13499f7daa0a34bfb 100644 |
| --- a/content/renderer/scheduler/renderer_task_queue_selector.cc |
| +++ b/content/renderer/scheduler/renderer_task_queue_selector.cc |
| @@ -4,6 +4,7 @@ |
| #include "content/renderer/scheduler/renderer_task_queue_selector.h" |
| +#include "base/debug/trace_event_argument.h" |
| #include "base/logging.h" |
| #include "base/pending_task.h" |
| @@ -96,27 +97,75 @@ bool RendererTaskQueueSelector::SelectWorkQueueToService( |
| 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)) { |
| - starvation_count_ = 0; |
| + 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)) { |
| - if (priority == HIGH_PRIORITY) { |
| - starvation_count_++; |
| - } else { |
| - starvation_count_ = 0; |
| - } |
| + 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(); |
| + } |
| + } |
|
rmcilroy
2014/11/07 18:21:57
indentation
Sami
2014/11/10 14:35:01
Whoops, fixed :)
|
| + |
| +// 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::debug::TracedValue* state) const { |
| + 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 |