Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(949)

Side by Side Diff: components/scheduler/base/work_queue_sets.cc

Issue 2118903002: scheduler: Move the Blink scheduler into Blink (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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_sets.h"
6
7 #include "base/logging.h"
8 #include "components/scheduler/base/work_queue.h"
9
10 namespace scheduler {
11 namespace internal {
12
13 WorkQueueSets::WorkQueueSets(size_t num_sets, const char* name)
14 : enqueue_order_to_work_queue_maps_(num_sets), name_(name) {}
15
16 WorkQueueSets::~WorkQueueSets() {}
17
18 void WorkQueueSets::AddQueue(WorkQueue* work_queue, size_t set_index) {
19 DCHECK(!work_queue->work_queue_sets());
20 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size());
21 EnqueueOrder enqueue_order;
22 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order);
23 work_queue->AssignToWorkQueueSets(this);
24 work_queue->AssignSetIndex(set_index);
25 if (!has_enqueue_order)
26 return;
27 enqueue_order_to_work_queue_maps_[set_index].insert(
28 std::make_pair(enqueue_order, work_queue));
29 }
30
31 void WorkQueueSets::RemoveQueue(WorkQueue* work_queue) {
32 DCHECK_EQ(this, work_queue->work_queue_sets());
33 EnqueueOrder enqueue_order;
34 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order);
35 work_queue->AssignToWorkQueueSets(nullptr);
36 if (!has_enqueue_order)
37 return;
38 size_t set_index = work_queue->work_queue_set_index();
39 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size());
40 DCHECK_EQ(
41 work_queue,
42 enqueue_order_to_work_queue_maps_[set_index].find(enqueue_order)->second);
43 enqueue_order_to_work_queue_maps_[set_index].erase(enqueue_order);
44 }
45
46 void WorkQueueSets::ChangeSetIndex(WorkQueue* work_queue, size_t set_index) {
47 DCHECK_EQ(this, work_queue->work_queue_sets());
48 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size());
49 EnqueueOrder enqueue_order;
50 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order);
51 size_t old_set = work_queue->work_queue_set_index();
52 DCHECK_LT(old_set, enqueue_order_to_work_queue_maps_.size());
53 DCHECK_NE(old_set, set_index);
54 work_queue->AssignSetIndex(set_index);
55 if (!has_enqueue_order)
56 return;
57 enqueue_order_to_work_queue_maps_[old_set].erase(enqueue_order);
58 enqueue_order_to_work_queue_maps_[set_index].insert(
59 std::make_pair(enqueue_order, work_queue));
60 }
61
62 void WorkQueueSets::OnPushQueue(WorkQueue* work_queue) {
63 // NOTE if this funciton changes, we need to keep |WorkQueueSets::AddQueue| in
64 // sync.
65 DCHECK_EQ(this, work_queue->work_queue_sets());
66 EnqueueOrder enqueue_order;
67 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order);
68 DCHECK(has_enqueue_order);
69 size_t set_index = work_queue->work_queue_set_index();
70 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size())
71 << " set_index = " << set_index;
72 enqueue_order_to_work_queue_maps_[set_index].insert(
73 std::make_pair(enqueue_order, work_queue));
74 }
75
76 void WorkQueueSets::OnPopQueue(WorkQueue* work_queue) {
77 size_t set_index = work_queue->work_queue_set_index();
78 DCHECK_EQ(this, work_queue->work_queue_sets());
79 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size());
80 DCHECK(!enqueue_order_to_work_queue_maps_[set_index].empty())
81 << " set_index = " << set_index;
82 DCHECK_EQ(enqueue_order_to_work_queue_maps_[set_index].begin()->second,
83 work_queue)
84 << " set_index = " << set_index;
85 // O(1) amortised.
86 enqueue_order_to_work_queue_maps_[set_index].erase(
87 enqueue_order_to_work_queue_maps_[set_index].begin());
88 EnqueueOrder enqueue_order;
89 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order);
90 if (!has_enqueue_order)
91 return;
92 enqueue_order_to_work_queue_maps_[set_index].insert(
93 std::make_pair(enqueue_order, work_queue));
94 }
95
96 bool WorkQueueSets::GetOldestQueueInSet(size_t set_index,
97 WorkQueue** out_work_queue) const {
98 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size());
99 if (enqueue_order_to_work_queue_maps_[set_index].empty())
100 return false;
101 *out_work_queue =
102 enqueue_order_to_work_queue_maps_[set_index].begin()->second;
103 #ifndef NDEBUG
104 EnqueueOrder enqueue_order;
105 DCHECK((*out_work_queue)->GetFrontTaskEnqueueOrder(&enqueue_order));
106 DCHECK_EQ(enqueue_order,
107 enqueue_order_to_work_queue_maps_[set_index].begin()->first);
108 #endif
109 return true;
110 }
111
112 bool WorkQueueSets::IsSetEmpty(size_t set_index) const {
113 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size())
114 << " set_index = " << set_index;
115 return enqueue_order_to_work_queue_maps_[set_index].empty();
116 }
117
118 #if DCHECK_IS_ON() || !defined(NDEBUG)
119 bool WorkQueueSets::ContainsWorkQueueForTest(
120 const WorkQueue* work_queue) const {
121 EnqueueOrder enqueue_order;
122 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order);
123
124 for (const EnqueueOrderToWorkQueueMap& map :
125 enqueue_order_to_work_queue_maps_) {
126 for (const EnqueueOrderToWorkQueueMap::value_type& key_value_pair : map) {
127 if (key_value_pair.second == work_queue) {
128 DCHECK(has_enqueue_order);
129 DCHECK_EQ(key_value_pair.first, enqueue_order);
130 DCHECK_EQ(this, work_queue->work_queue_sets());
131 return true;
132 }
133 }
134 }
135
136 if (work_queue->work_queue_sets() == this) {
137 DCHECK(!has_enqueue_order);
138 return true;
139 }
140
141 return false;
142 }
143 #endif
144
145 } // namespace internal
146 } // namespace scheduler
OLDNEW
« no previous file with comments | « components/scheduler/base/work_queue_sets.h ('k') | components/scheduler/base/work_queue_sets_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698