blob: 6b063e0dd8f76b9fb306b32907a7b5ba51d0dcf5 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/scheduler/base/work_queue.h"
#include "components/scheduler/base/work_queue_sets.h"
namespace scheduler {
namespace internal {
WorkQueue::WorkQueue(WorkQueueSets* task_queue_sets,
TaskQueueImpl* task_queue,
const char* name)
: work_queue_sets_(task_queue_sets),
task_queue_(task_queue),
work_queue_set_index_(0),
name_(name) {}
void WorkQueue::AsValueInto(base::trace_event::TracedValue* state) const {
std::queue<TaskQueueImpl::Task> queue_copy(work_queue_);
while (!queue_copy.empty()) {
TaskQueueImpl::TaskAsValueInto(queue_copy.front(), state);
queue_copy.pop();
}
}
WorkQueue::~WorkQueue() {}
void WorkQueue::Clear() {
work_queue_ = std::queue<TaskQueueImpl::Task>();
}
bool WorkQueue::GetFrontTaskEnqueueOrder(EnqueueOrder* enqueue_order) const {
if (work_queue_.empty())
return false;
*enqueue_order = work_queue_.front().enqueue_order();
return true;
}
void WorkQueue::Push(const TaskQueueImpl::Task&& task) {
bool was_empty = work_queue_.empty();
work_queue_.push(task);
if (was_empty)
work_queue_sets_->OnPushQueue(this);
}
void WorkQueue::PushTaskForTest(const TaskQueueImpl::Task&& task) {
work_queue_.push(task);
}
void WorkQueue::PushAndSetEnqueueOrder(const TaskQueueImpl::Task&& task,
EnqueueOrder enqueue_order) {
bool was_empty = work_queue_.empty();
work_queue_.push(task);
work_queue_.back().set_enqueue_order(enqueue_order);
if (was_empty)
work_queue_sets_->OnPushQueue(this);
}
void WorkQueue::PopTaskForTest() {
work_queue_.pop();
}
void WorkQueue::SwapLocked(std::queue<TaskQueueImpl::Task>& incoming_queue) {
std::swap(work_queue_, incoming_queue);
if (!work_queue_.empty())
work_queue_sets_->OnPushQueue(this);
task_queue_->TraceQueueSize(true);
}
TaskQueueImpl::Task WorkQueue::TakeTaskFromWorkQueue() {
DCHECK(!work_queue_.empty());
TaskQueueImpl::Task pending_task = std::move(work_queue_.front());
work_queue_.pop();
work_queue_sets_->OnPopQueue(this);
task_queue_->TraceQueueSize(false);
return pending_task;
}
} // namespace internal
} // namespace scheduler