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

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

Issue 1685093002: Fix bug with TaskQueueSelector and blocked queues (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix UAF Created 4 years, 10 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 "components/scheduler/base/work_queue_sets.h" 5 #include "components/scheduler/base/work_queue_sets.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "components/scheduler/base/work_queue.h" 8 #include "components/scheduler/base/work_queue.h"
9 9
10 namespace scheduler { 10 namespace scheduler {
11 namespace internal { 11 namespace internal {
12 12
13 WorkQueueSets::WorkQueueSets(size_t num_sets) 13 WorkQueueSets::WorkQueueSets(size_t num_sets, const char* name)
14 : enqueue_order_to_work_queue_maps_(num_sets) {} 14 : enqueue_order_to_work_queue_maps_(num_sets), name_(name) {}
15 15
16 WorkQueueSets::~WorkQueueSets() {} 16 WorkQueueSets::~WorkQueueSets() {}
17 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
18 void WorkQueueSets::RemoveQueue(WorkQueue* work_queue) { 31 void WorkQueueSets::RemoveQueue(WorkQueue* work_queue) {
19 DCHECK_EQ(this, work_queue->work_queue_sets()); 32 DCHECK_EQ(this, work_queue->work_queue_sets());
20 EnqueueOrder enqueue_order; 33 EnqueueOrder enqueue_order;
21 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order); 34 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order);
35 work_queue->AssignToWorkQueueSets(nullptr);
22 if (!has_enqueue_order) 36 if (!has_enqueue_order)
23 return; 37 return;
24 size_t set_index = work_queue->work_queue_set_index(); 38 size_t set_index = work_queue->work_queue_set_index();
25 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size()); 39 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size());
26 DCHECK_EQ( 40 DCHECK_EQ(
27 work_queue, 41 work_queue,
28 enqueue_order_to_work_queue_maps_[set_index].find(enqueue_order)->second); 42 enqueue_order_to_work_queue_maps_[set_index].find(enqueue_order)->second);
29 enqueue_order_to_work_queue_maps_[set_index].erase(enqueue_order); 43 enqueue_order_to_work_queue_maps_[set_index].erase(enqueue_order);
30 } 44 }
31 45
32 void WorkQueueSets::AssignQueueToSet(WorkQueue* work_queue, size_t set_index) { 46 void WorkQueueSets::ChangeSetIndex(WorkQueue* work_queue, size_t set_index) {
47 DCHECK_EQ(this, work_queue->work_queue_sets());
33 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size()); 48 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size());
34 EnqueueOrder enqueue_order; 49 EnqueueOrder enqueue_order;
35 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order); 50 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order);
36 size_t old_set = work_queue->work_queue_set_index(); 51 size_t old_set = work_queue->work_queue_set_index();
37 DCHECK_LT(old_set, enqueue_order_to_work_queue_maps_.size()); 52 DCHECK_LT(old_set, enqueue_order_to_work_queue_maps_.size());
38 work_queue->AssignToWorkQueueSets(this, set_index); 53 DCHECK_NE(old_set, set_index);
54 work_queue->AssignSetIndex(set_index);
39 if (!has_enqueue_order) 55 if (!has_enqueue_order)
40 return; 56 return;
41 enqueue_order_to_work_queue_maps_[old_set].erase(enqueue_order); 57 enqueue_order_to_work_queue_maps_[old_set].erase(enqueue_order);
42 enqueue_order_to_work_queue_maps_[set_index].insert( 58 enqueue_order_to_work_queue_maps_[set_index].insert(
43 std::make_pair(enqueue_order, work_queue)); 59 std::make_pair(enqueue_order, work_queue));
44 } 60 }
45 61
46 void WorkQueueSets::OnPushQueue(WorkQueue* work_queue) { 62 void WorkQueueSets::OnPushQueue(WorkQueue* work_queue) {
63 // NOTE if this funciton changes, we need to keep |WorkQueueSets::AddQueue| in
64 // sync.
47 DCHECK_EQ(this, work_queue->work_queue_sets()); 65 DCHECK_EQ(this, work_queue->work_queue_sets());
48 EnqueueOrder enqueue_order; 66 EnqueueOrder enqueue_order;
49 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order); 67 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order);
50 DCHECK(has_enqueue_order); 68 DCHECK(has_enqueue_order);
51 size_t set_index = work_queue->work_queue_set_index(); 69 size_t set_index = work_queue->work_queue_set_index();
52 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size()) 70 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size())
53 << " set_index = " << set_index; 71 << " set_index = " << set_index;
54 enqueue_order_to_work_queue_maps_[set_index].insert( 72 enqueue_order_to_work_queue_maps_[set_index].insert(
55 std::make_pair(enqueue_order, work_queue)); 73 std::make_pair(enqueue_order, work_queue));
56 } 74 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 return true; 109 return true;
92 } 110 }
93 111
94 bool WorkQueueSets::IsSetEmpty(size_t set_index) const { 112 bool WorkQueueSets::IsSetEmpty(size_t set_index) const {
95 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size()) 113 DCHECK_LT(set_index, enqueue_order_to_work_queue_maps_.size())
96 << " set_index = " << set_index; 114 << " set_index = " << set_index;
97 return enqueue_order_to_work_queue_maps_[set_index].empty(); 115 return enqueue_order_to_work_queue_maps_[set_index].empty();
98 } 116 }
99 117
100 #if DCHECK_IS_ON() || !defined(NDEBUG) 118 #if DCHECK_IS_ON() || !defined(NDEBUG)
101 bool WorkQueueSets::ContainsWorkQueueForTest(WorkQueue* work_queue) const { 119 bool WorkQueueSets::ContainsWorkQueueForTest(
120 const WorkQueue* work_queue) const {
102 EnqueueOrder enqueue_order; 121 EnqueueOrder enqueue_order;
103 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order); 122 bool has_enqueue_order = work_queue->GetFrontTaskEnqueueOrder(&enqueue_order);
104 123
105 for (const EnqueueOrderToWorkQueueMap& map : 124 for (const EnqueueOrderToWorkQueueMap& map :
106 enqueue_order_to_work_queue_maps_) { 125 enqueue_order_to_work_queue_maps_) {
107 for (const EnqueueOrderToWorkQueueMap::value_type& key_value_pair : map) { 126 for (const EnqueueOrderToWorkQueueMap::value_type& key_value_pair : map) {
108 if (key_value_pair.second == work_queue) { 127 if (key_value_pair.second == work_queue) {
109 DCHECK(has_enqueue_order); 128 DCHECK(has_enqueue_order);
110 DCHECK_EQ(key_value_pair.first, enqueue_order); 129 DCHECK_EQ(key_value_pair.first, enqueue_order);
111 DCHECK_EQ(this, work_queue->work_queue_sets()); 130 DCHECK_EQ(this, work_queue->work_queue_sets());
112 return true; 131 return true;
113 } 132 }
114 } 133 }
115 } 134 }
116 135
136 if (work_queue->work_queue_sets() == this) {
137 DCHECK(!has_enqueue_order);
138 return true;
139 }
140
117 return false; 141 return false;
118 } 142 }
119 #endif 143 #endif
120 144
121 } // namespace internal 145 } // namespace internal
122 } // namespace scheduler 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