OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "components/scheduler/base/work_queue.h" | |
6 | |
7 #include "components/scheduler/base/work_queue_sets.h" | |
8 | |
9 namespace scheduler { | |
10 namespace internal { | |
11 | |
12 WorkQueue::WorkQueue(TaskQueueImpl* task_queue, const char* name) | |
13 : work_queue_sets_(nullptr), | |
14 task_queue_(task_queue), | |
15 work_queue_set_index_(0), | |
16 name_(name) {} | |
17 | |
18 void WorkQueue::AsValueInto(base::trace_event::TracedValue* state) const { | |
19 // Remove const to search |work_queue_| in the destructive manner. Restore the | |
20 // content from |visited| later. | |
21 std::queue<TaskQueueImpl::Task>* mutable_queue = | |
22 const_cast<std::queue<TaskQueueImpl::Task>*>(&work_queue_); | |
23 std::queue<TaskQueueImpl::Task> visited; | |
24 while (!mutable_queue->empty()) { | |
25 TaskQueueImpl::TaskAsValueInto(mutable_queue->front(), state); | |
26 visited.push(std::move(mutable_queue->front())); | |
27 mutable_queue->pop(); | |
28 } | |
29 *mutable_queue = std::move(visited); | |
30 } | |
31 | |
32 WorkQueue::~WorkQueue() { | |
33 DCHECK(!work_queue_sets_) << task_queue_ ->GetName() << " : " | |
34 << work_queue_sets_->name() << " : " << name_; | |
35 } | |
36 | |
37 const TaskQueueImpl::Task* WorkQueue::GetFrontTask() const { | |
38 if (work_queue_.empty()) | |
39 return nullptr; | |
40 return &work_queue_.front(); | |
41 } | |
42 | |
43 bool WorkQueue::GetFrontTaskEnqueueOrder(EnqueueOrder* enqueue_order) const { | |
44 if (work_queue_.empty()) | |
45 return false; | |
46 *enqueue_order = work_queue_.front().enqueue_order(); | |
47 return true; | |
48 } | |
49 | |
50 void WorkQueue::Push(TaskQueueImpl::Task task) { | |
51 bool was_empty = work_queue_.empty(); | |
52 work_queue_.push(std::move(task)); | |
53 if (was_empty && work_queue_sets_) | |
54 work_queue_sets_->OnPushQueue(this); | |
55 } | |
56 | |
57 void WorkQueue::PushAndSetEnqueueOrder(TaskQueueImpl::Task task, | |
58 EnqueueOrder enqueue_order) { | |
59 bool was_empty = work_queue_.empty(); | |
60 work_queue_.push(std::move(task)); | |
61 work_queue_.back().set_enqueue_order(enqueue_order); | |
62 | |
63 if (was_empty && work_queue_sets_) | |
64 work_queue_sets_->OnPushQueue(this); | |
65 } | |
66 | |
67 void WorkQueue::PopTaskForTest() { | |
68 work_queue_.pop(); | |
69 } | |
70 | |
71 void WorkQueue::SwapLocked(std::queue<TaskQueueImpl::Task>& incoming_queue) { | |
72 std::swap(work_queue_, incoming_queue); | |
73 | |
74 if (!work_queue_.empty() && work_queue_sets_) | |
75 work_queue_sets_->OnPushQueue(this); | |
76 task_queue_->TraceQueueSize(true); | |
77 } | |
78 | |
79 TaskQueueImpl::Task WorkQueue::TakeTaskFromWorkQueue() { | |
80 DCHECK(work_queue_sets_); | |
81 DCHECK(!work_queue_.empty()); | |
82 TaskQueueImpl::Task pending_task = std::move(work_queue_.front()); | |
83 work_queue_.pop(); | |
84 work_queue_sets_->OnPopQueue(this); | |
85 task_queue_->TraceQueueSize(false); | |
86 return pending_task; | |
87 } | |
88 | |
89 void WorkQueue::AssignToWorkQueueSets(WorkQueueSets* work_queue_sets) { | |
90 work_queue_sets_ = work_queue_sets; | |
91 } | |
92 | |
93 void WorkQueue::AssignSetIndex(size_t work_queue_set_index) { | |
94 work_queue_set_index_ = work_queue_set_index; | |
95 } | |
96 | |
97 bool WorkQueue::ShouldRunBefore(const WorkQueue* other_queue) const { | |
98 DCHECK(!work_queue_.empty()); | |
99 DCHECK(!other_queue->work_queue_.empty()); | |
100 EnqueueOrder enqueue_order = 0; | |
101 EnqueueOrder other_enqueue_order = 0; | |
102 bool have_task = GetFrontTaskEnqueueOrder(&enqueue_order); | |
103 bool have_other_task = | |
104 other_queue->GetFrontTaskEnqueueOrder(&other_enqueue_order); | |
105 DCHECK(have_task); | |
106 DCHECK(have_other_task); | |
107 return enqueue_order < other_enqueue_order; | |
108 } | |
109 | |
110 } // namespace internal | |
111 } // namespace scheduler | |
OLD | NEW |