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

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: Improve the dcheck 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(
Sami 2016/02/10 13:15:47 Should we call OnPushQueue instead? If we ever add
alex clarke (OOO till 29th) 2016/02/10 14:37:12 We'd end up calling work_queue->GetFrontTaskEnqueu
Sami 2016/02/10 15:30:38 Yeah, I was hoping the compiler would noticed that
alex clarke (OOO till 29th) 2016/02/10 17:26:08 Done.
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) {
47 DCHECK_EQ(this, work_queue->work_queue_sets()); 63 DCHECK_EQ(this, work_queue->work_queue_sets());
48 EnqueueOrder enqueue_order; 64 EnqueueOrder enqueue_order;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 for (const EnqueueOrderToWorkQueueMap::value_type& key_value_pair : map) { 123 for (const EnqueueOrderToWorkQueueMap::value_type& key_value_pair : map) {
108 if (key_value_pair.second == work_queue) { 124 if (key_value_pair.second == work_queue) {
109 DCHECK(has_enqueue_order); 125 DCHECK(has_enqueue_order);
110 DCHECK_EQ(key_value_pair.first, enqueue_order); 126 DCHECK_EQ(key_value_pair.first, enqueue_order);
111 DCHECK_EQ(this, work_queue->work_queue_sets()); 127 DCHECK_EQ(this, work_queue->work_queue_sets());
112 return true; 128 return true;
113 } 129 }
114 } 130 }
115 } 131 }
116 132
133 if (work_queue->work_queue_sets() == this) {
Sami 2016/02/10 13:15:47 When would the work queue be assigned to a set but
alex clarke (OOO till 29th) 2016/02/10 14:37:12 Consider: WorkQueueSets a; WorkQueueSets b; WorkQ
Sami 2016/02/10 15:30:38 Ah, the case of an empty queue. Makes sense, thank
134 DCHECK(!has_enqueue_order);
135 return true;
136 }
137
117 return false; 138 return false;
118 } 139 }
119 #endif 140 #endif
120 141
121 } // namespace internal 142 } // namespace internal
122 } // namespace scheduler 143 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698