OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |