| 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..b04ada836252d3100e7ffb86d647db4484a4f054 100644
|
| --- a/third_party/WebKit/Source/platform/scheduler/base/work_queue.cc
|
| +++ b/third_party/WebKit/Source/platform/scheduler/base/work_queue.cc
|
| @@ -4,18 +4,22 @@
|
|
|
| #include "platform/scheduler/base/work_queue.h"
|
|
|
| +#include "platform/scheduler/base/moveable_auto_lock.h"
|
| #include "platform/scheduler/base/work_queue_sets.h"
|
|
|
| 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 +89,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 +112,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();
|
| + // 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;
|
|
|