Chromium Code Reviews| Index: third_party/WebKit/Source/platform/scheduler/base/work_queue.cc |
| diff --git a/third_party/WebKit/Source/platform/scheduler/base/work_queue.cc b/third_party/WebKit/Source/platform/scheduler/base/work_queue.cc |
| index 0b7d0cd9b753d9850c3bf77138b99b39d16e49ed..3a8210698d7e41b0a2f549e550931f822ef28d18 100644 |
| --- a/third_party/WebKit/Source/platform/scheduler/base/work_queue.cc |
| +++ b/third_party/WebKit/Source/platform/scheduler/base/work_queue.cc |
| @@ -10,12 +10,15 @@ namespace blink { |
| namespace scheduler { |
| namespace internal { |
| -WorkQueue::WorkQueue(TaskQueueImpl* task_queue, const char* name) |
| +WorkQueue::WorkQueue(TaskQueueImpl* task_queue, |
| + const char* name, |
| + QueueType queue_type) |
| : work_queue_sets_(nullptr), |
| task_queue_(task_queue), |
| work_queue_set_index_(0), |
| name_(name), |
| - fence_(0) {} |
| + fence_(0), |
| + queue_type_(queue_type) {} |
| void WorkQueue::AsValueInto(base::trace_event::TracedValue* state) const { |
| for (const TaskQueueImpl::Task& task : work_queue_) { |
| @@ -85,11 +88,13 @@ void WorkQueue::PopTaskForTest() { |
| work_queue_.pop_front(); |
| } |
| -void WorkQueue::SwapLocked(WTF::Deque<TaskQueueImpl::Task>& incoming_queue) { |
| +void WorkQueue::ReloadEmptyImmediateQueue() { |
| DCHECK(work_queue_.empty()); |
| - work_queue_.swap(incoming_queue); |
| + |
| + work_queue_ = task_queue_->TakeImmediateIncomingQueue(); |
| if (work_queue_.empty()) |
| return; |
| + |
| // If we hit the fence, pretend to WorkQueueSets that we're empty. |
| if (work_queue_sets_ && !BlockedByFence()) |
| work_queue_sets_->OnPushQueue(this); |
| @@ -106,6 +111,11 @@ TaskQueueImpl::Task WorkQueue::TakeTaskFromWorkQueue() { |
| } |
| TaskQueueImpl::Task pending_task = work_queue_.takeFirst(); |
| + // NB immediate tasks have a different pipeline to delayed ones. |
| + if (queue_type_ == QueueType::IMMEDIATE && work_queue_.empty()) |
| + work_queue_ = task_queue_->TakeImmediateIncomingQueue(); |
|
Sami
2017/01/18 17:57:04
Not sure why we're not calling OnPushQueue here? C
alex clarke (OOO till 29th)
2017/01/19 08:50:53
No, we'd have to do that after OnPopQueue() (becau
Sami
2017/01/19 11:57:38
Okay, I think I understand now: we're short-circui
alex clarke (OOO till 29th)
2017/01/19 12:34:31
Done.
|
| + // OnPopQueue calls GetFrontTaskEnqueueOrder which checks BlockedByFence() so |
| + // we don't need to here. |
| work_queue_sets_->OnPopQueue(this); |
| task_queue_->TraceQueueSize(false); |
| return pending_task; |