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

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/base/work_queue.cc

Issue 2546423002: [Try # 3] Scheduler refactoring to virtually eliminate redundant DoWorks (Closed)
Patch Set: Add an extra dcheck Created 3 years, 11 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "platform/scheduler/base/work_queue.h" 5 #include "platform/scheduler/base/work_queue.h"
6 6
7 #include "platform/scheduler/base/moveable_auto_lock.h"
7 #include "platform/scheduler/base/work_queue_sets.h" 8 #include "platform/scheduler/base/work_queue_sets.h"
8 9
9 namespace blink { 10 namespace blink {
10 namespace scheduler { 11 namespace scheduler {
11 namespace internal { 12 namespace internal {
12 13
13 WorkQueue::WorkQueue(TaskQueueImpl* task_queue, const char* name) 14 WorkQueue::WorkQueue(TaskQueueImpl* task_queue,
15 const char* name,
16 QueueType queue_type)
14 : work_queue_sets_(nullptr), 17 : work_queue_sets_(nullptr),
15 task_queue_(task_queue), 18 task_queue_(task_queue),
16 work_queue_set_index_(0), 19 work_queue_set_index_(0),
17 name_(name), 20 name_(name),
18 fence_(0) {} 21 fence_(0),
22 queue_type_(queue_type) {}
19 23
20 void WorkQueue::AsValueInto(base::trace_event::TracedValue* state) const { 24 void WorkQueue::AsValueInto(base::trace_event::TracedValue* state) const {
21 for (const TaskQueueImpl::Task& task : work_queue_) { 25 for (const TaskQueueImpl::Task& task : work_queue_) {
22 TaskQueueImpl::TaskAsValueInto(task, state); 26 TaskQueueImpl::TaskAsValueInto(task, state);
23 } 27 }
24 } 28 }
25 29
26 WorkQueue::~WorkQueue() { 30 WorkQueue::~WorkQueue() {
27 DCHECK(!work_queue_sets_) << task_queue_->GetName() << " : " 31 DCHECK(!work_queue_sets_) << task_queue_->GetName() << " : "
28 << work_queue_sets_->name() << " : " << name_; 32 << work_queue_sets_->name() << " : " << name_;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 if (work_queue_sets_ && !BlockedByFence()) 82 if (work_queue_sets_ && !BlockedByFence())
79 work_queue_sets_->OnPushQueue(this); 83 work_queue_sets_->OnPushQueue(this);
80 } 84 }
81 85
82 void WorkQueue::PopTaskForTest() { 86 void WorkQueue::PopTaskForTest() {
83 if (work_queue_.empty()) 87 if (work_queue_.empty())
84 return; 88 return;
85 work_queue_.pop_front(); 89 work_queue_.pop_front();
86 } 90 }
87 91
88 void WorkQueue::SwapLocked(WTF::Deque<TaskQueueImpl::Task>& incoming_queue) { 92 void WorkQueue::ReloadEmptyImmediateQueue() {
89 DCHECK(work_queue_.empty()); 93 DCHECK(work_queue_.empty());
90 work_queue_.swap(incoming_queue); 94
95 work_queue_ = task_queue_->TakeImmediateIncomingQueue();
91 if (work_queue_.empty()) 96 if (work_queue_.empty())
92 return; 97 return;
98
93 // If we hit the fence, pretend to WorkQueueSets that we're empty. 99 // If we hit the fence, pretend to WorkQueueSets that we're empty.
94 if (work_queue_sets_ && !BlockedByFence()) 100 if (work_queue_sets_ && !BlockedByFence())
95 work_queue_sets_->OnPushQueue(this); 101 work_queue_sets_->OnPushQueue(this);
96 } 102 }
97 103
98 TaskQueueImpl::Task WorkQueue::TakeTaskFromWorkQueue() { 104 TaskQueueImpl::Task WorkQueue::TakeTaskFromWorkQueue() {
99 DCHECK(work_queue_sets_); 105 DCHECK(work_queue_sets_);
100 DCHECK(!work_queue_.empty()); 106 DCHECK(!work_queue_.empty());
101 107
102 // Skip over canceled tasks, except for the last one since we always return 108 // Skip over canceled tasks, except for the last one since we always return
103 // something. 109 // something.
104 while (work_queue_.size() > 1u && work_queue_.front().task.IsCancelled()) { 110 while (work_queue_.size() > 1u && work_queue_.front().task.IsCancelled()) {
105 work_queue_.pop_front(); 111 work_queue_.pop_front();
106 } 112 }
107 113
108 TaskQueueImpl::Task pending_task = work_queue_.takeFirst(); 114 TaskQueueImpl::Task pending_task = work_queue_.takeFirst();
115 // NB immediate tasks have a different pipeline to delayed ones.
116 if (queue_type_ == QueueType::IMMEDIATE && work_queue_.empty())
117 work_queue_ = task_queue_->TakeImmediateIncomingQueue();
118 // OnPopQueue calls GetFrontTaskEnqueueOrder which checks BlockedByFence() so
119 // we don't need to here.
109 work_queue_sets_->OnPopQueue(this); 120 work_queue_sets_->OnPopQueue(this);
110 task_queue_->TraceQueueSize(false); 121 task_queue_->TraceQueueSize(false);
111 return pending_task; 122 return pending_task;
112 } 123 }
113 124
114 void WorkQueue::AssignToWorkQueueSets(WorkQueueSets* work_queue_sets) { 125 void WorkQueue::AssignToWorkQueueSets(WorkQueueSets* work_queue_sets) {
115 work_queue_sets_ = work_queue_sets; 126 work_queue_sets_ = work_queue_sets;
116 } 127 }
117 128
118 void WorkQueue::AssignSetIndex(size_t work_queue_set_index) { 129 void WorkQueue::AssignSetIndex(size_t work_queue_set_index) {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 bool have_other_task = 166 bool have_other_task =
156 other_queue->GetFrontTaskEnqueueOrder(&other_enqueue_order); 167 other_queue->GetFrontTaskEnqueueOrder(&other_enqueue_order);
157 DCHECK(have_task); 168 DCHECK(have_task);
158 DCHECK(have_other_task); 169 DCHECK(have_other_task);
159 return enqueue_order < other_enqueue_order; 170 return enqueue_order < other_enqueue_order;
160 } 171 }
161 172
162 } // namespace internal 173 } // namespace internal
163 } // namespace scheduler 174 } // namespace scheduler
164 } // namespace blink 175 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698