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; |