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

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/base/work_queue_sets.cc

Issue 2396533004: Introduce a FlatMap and FlatSet into WTF (Closed)
Patch Set: Add missing ostream override Created 4 years, 2 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
1 // Copyright 2015 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "platform/scheduler/base/work_queue_sets.h" 5 #include "platform/scheduler/base/work_queue_sets.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "platform/scheduler/base/work_queue.h" 8 #include "platform/scheduler/base/work_queue.h"
9 9
10 namespace blink { 10 namespace blink {
11 namespace scheduler { 11 namespace scheduler {
12 namespace internal { 12 namespace internal {
13 13
14 WorkQueueSets::WorkQueueSets(size_t num_sets, const char* name) 14 WorkQueueSets::WorkQueueSets(size_t num_sets, const char* name)
15 : enqueue_order_to_work_queue_maps_(num_sets), name_(name) {} 15 : enqueue_order_to_work_queue_maps_(num_sets), name_(name) {}
16 16
17 WorkQueueSets::~WorkQueueSets() {} 17 WorkQueueSets::~WorkQueueSets() {}
18 18
19 void WorkQueueSets::AddQueue(WorkQueue* work_queue, size_t set_index) { 19 void WorkQueueSets::AddQueue(WorkQueue* work_queue, size_t set_index) {
20 DCHECK(!work_queue->work_queue_sets()); 20 DCHECK(!work_queue->work_queue_sets());
21 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size()); 21 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size());
22 EnqueueOrder enqueue_order; 22 EnqueueOrder enqueue_order;
23 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order); 23 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order);
24 work_queue->AssignToWorkQueueSets(this); 24 work_queue->AssignToWorkQueueSets(this);
25 work_queue->AssignSetIndex(set_index); 25 work_queue->AssignSetIndex(set_index);
26 if (!has_enqueue_order) 26 if (!has_enqueue_order)
27 return; 27 return;
28 enqueue_order_to_work_queue_maps_[set_index].insert( 28 enqueue_order_to_work_queue_maps_[set_index].insertUnique(
29 std::make_pair(enqueue_order, work_queue)); 29 std::make_pair(enqueue_order, work_queue));
30 } 30 }
31 31
32 void WorkQueueSets::RemoveQueue(WorkQueue* work_queue) { 32 void WorkQueueSets::RemoveQueue(WorkQueue* work_queue) {
33 DCHECK_EQ(this, work_queue->work_queue_sets()); 33 DCHECK_EQ(this, work_queue->work_queue_sets());
34 EnqueueOrder enqueue_order; 34 EnqueueOrder enqueue_order;
35 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order); 35 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order);
36 work_queue->AssignToWorkQueueSets(nullptr); 36 work_queue->AssignToWorkQueueSets(nullptr);
37 if (!has_enqueue_order) 37 if (!has_enqueue_order)
38 return; 38 return;
(...skipping 10 matching lines...) Expand all
49 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size()); 49 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size());
50 EnqueueOrder enqueue_order; 50 EnqueueOrder enqueue_order;
51 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order); 51 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order);
52 size_t old_set = work_queue->work_queue_set_index(); 52 size_t old_set = work_queue->work_queue_set_index();
53 DCHECK_LT(old_set, enqueue_order_to_work_queue_maps_.size()); 53 DCHECK_LT(old_set, enqueue_order_to_work_queue_maps_.size());
54 DCHECK_NE(old_set, set_index); 54 DCHECK_NE(old_set, set_index);
55 work_queue->AssignSetIndex(set_index); 55 work_queue->AssignSetIndex(set_index);
56 if (!has_enqueue_order) 56 if (!has_enqueue_order)
57 return; 57 return;
58 enqueue_order_to_work_queue_maps_[old_set].erase(enqueue_order); 58 enqueue_order_to_work_queue_maps_[old_set].erase(enqueue_order);
59 enqueue_order_to_work_queue_maps_[set_index].insert( 59 enqueue_order_to_work_queue_maps_[set_index].insertUnique(
60 std::make_pair(enqueue_order, work_queue)); 60 std::make_pair(enqueue_order, work_queue));
61 } 61 }
62 62
63 void WorkQueueSets::OnPushQueue(WorkQueue* work_queue) { 63 void WorkQueueSets::OnPushQueue(WorkQueue* work_queue) {
64 // NOTE if this function changes, we need to keep |WorkQueueSets::AddQueue| in 64 // NOTE if this function changes, we need to keep |WorkQueueSets::AddQueue| in
65 // sync. 65 // sync.
66 DCHECK_EQ(this, work_queue->work_queue_sets()); 66 DCHECK_EQ(this, work_queue->work_queue_sets());
67 EnqueueOrder enqueue_order; 67 EnqueueOrder enqueue_order;
68 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order); 68 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order);
69 DCHECK(has_enqueue_order); 69 DCHECK(has_enqueue_order);
70 size_t set_index = work_queue->work_queue_set_index(); 70 size_t set_index = work_queue->work_queue_set_index();
71 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size()) 71 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size())
72 << " set_index = " << set_index; 72 << " set_index = " << set_index;
73 enqueue_order_to_work_queue_maps_[set_index].insert( 73 enqueue_order_to_work_queue_maps_[set_index].insertUnique(
74 std::make_pair(enqueue_order, work_queue)); 74 std::make_pair(enqueue_order, work_queue));
75 } 75 }
76 76
77 void WorkQueueSets::OnPopQueue(WorkQueue* work_queue) { 77 void WorkQueueSets::OnPopQueue(WorkQueue* work_queue) {
78 // Assume that |work_queue| contains the lowest enqueue_order. 78 // Assume that |work_queue| contains the lowest enqueue_order.
79 size_t set_index = work_queue->work_queue_set_index(); 79 size_t set_index = work_queue->work_queue_set_index();
80 DCHECK_EQ(this, work_queue->work_queue_sets()); 80 DCHECK_EQ(this, work_queue->work_queue_sets());
81 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size()); 81 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size());
82 DCHECK(!enqueue_order_to_work_queue_maps_[set_index].empty()) 82 DCHECK(!enqueue_order_to_work_queue_maps_[set_index].empty())
83 << " set_index = " << set_index; 83 << " set_index = " << set_index;
84 DCHECK_EQ(enqueue_order_to_work_queue_maps_[set_index].begin()->second, 84 DCHECK_EQ(enqueue_order_to_work_queue_maps_[set_index].begin()->second,
85 work_queue) 85 work_queue)
86 << " set_index = " << set_index; 86 << " set_index = " << set_index;
87 EnqueueOrderToWorkQueueMap::iterator old_it =
88 enqueue_order_to_work_queue_maps_[set_index].begin();
89 EnqueueOrder enqueue_order; 87 EnqueueOrder enqueue_order;
90 if (work_queue->GetFrontTaskEnqueueOrder(&enqueue_order)) { 88 if (work_queue->GetFrontTaskEnqueueOrder(&enqueue_order)) {
91 // Amortized O(1) if the new location is close to |old_it|, otherwise 89 enqueue_order_to_work_queue_maps_[set_index].ChangeKeyUnique(
92 // O(log n). 90 enqueue_order_to_work_queue_maps_[set_index].begin(), enqueue_order);
93 enqueue_order_to_work_queue_maps_[set_index].insert( 91 } else {
94 std::make_pair(enqueue_order, work_queue)); 92 enqueue_order_to_work_queue_maps_[set_index].erase(
93 enqueue_order_to_work_queue_maps_[set_index].begin());
95 } 94 }
96 // O(1)
97 enqueue_order_to_work_queue_maps_[set_index].erase(old_it);
98 } 95 }
99 96
100 bool WorkQueueSets::GetOldestQueueInSet(size_t set_index, 97 bool WorkQueueSets::GetOldestQueueInSet(size_t set_index,
101 WorkQueue** out_work_queue) const { 98 WorkQueue** out_work_queue) const {
102 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size()); 99 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size());
103 if (enqueue_order_to_work_queue_maps_[set_index].empty()) 100 if (enqueue_order_to_work_queue_maps_[set_index].empty())
104 return false; 101 return false;
105 *out_work_queue = 102 *out_work_queue =
106 enqueue_order_to_work_queue_maps_[set_index].begin()->second; 103 enqueue_order_to_work_queue_maps_[set_index].begin()->second;
107 #ifndef NDEBUG 104 #ifndef NDEBUG
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 return true; 139 return true;
143 } 140 }
144 141
145 return false; 142 return false;
146 } 143 }
147 #endif 144 #endif
148 145
149 } // namespace internal 146 } // namespace internal
150 } // namespace scheduler 147 } // namespace scheduler
151 } // namespace blink 148 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698