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

Side by Side Diff: services/resource_coordinator/coordination_unit/coordination_unit_impl.cc

Issue 2942403002: [GRC] Coordination Unit Graph Observer (Closed)
Patch Set: Rename API function calls Created 3 years, 6 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 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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 "services/resource_coordinator/coordination_unit/coordination_unit_impl .h" 5 #include "services/resource_coordinator/coordination_unit/coordination_unit_impl .h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <unordered_map> 8 #include <unordered_map>
9 #include <utility> 9 #include <utility>
10 10
11 #include "base/strings/string_number_conversions.h" 11 #include "base/strings/string_number_conversions.h"
12 #include "mojo/public/cpp/bindings/strong_binding.h" 12 #include "mojo/public/cpp/bindings/strong_binding.h"
13 #include "services/resource_coordinator/coordination_unit/coordination_unit_grap h_observer.h"
13 #include "services/resource_coordinator/public/cpp/coordination_unit_id.h" 14 #include "services/resource_coordinator/public/cpp/coordination_unit_id.h"
14 15
15 namespace resource_coordinator { 16 namespace resource_coordinator {
16 17
17 namespace { 18 namespace {
18 19
19 using CUIDMap = std::unordered_map<CoordinationUnitID, CoordinationUnitImpl*>; 20 using CUIDMap = std::unordered_map<CoordinationUnitID, CoordinationUnitImpl*>;
20 21
21 CUIDMap& g_cu_map() { 22 CUIDMap& g_cu_map() {
22 static CUIDMap* instance = new CUIDMap(); 23 static CUIDMap* instance = new CUIDMap();
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 if (AddChild(child)) { 151 if (AddChild(child)) {
151 child->AddParent(this); 152 child->AddParent(this);
152 } 153 }
153 } 154 }
154 } 155 }
155 156
156 bool CoordinationUnitImpl::AddChild(CoordinationUnitImpl* child) { 157 bool CoordinationUnitImpl::AddChild(CoordinationUnitImpl* child) {
157 // We don't recalculate the policy here as policies are only dependent 158 // We don't recalculate the policy here as policies are only dependent
158 // on the current CU or its parents, not its children. In other words, 159 // on the current CU or its parents, not its children. In other words,
159 // policies only bubble down. 160 // policies only bubble down.
160 return children_.count(child) ? false : children_.insert(child).second; 161 bool success =
162 children_.count(child) ? false : children_.insert(child).second;
163
164 if (success) {
165 for (auto* observer :
166 on_child_added_event_observer_registry_.GetObserversForFilter(
167 child->id().type)) {
168 observer->OnChildAddedEvent(this, child);
169 }
170 }
171
172 return success;
161 } 173 }
162 174
163 void CoordinationUnitImpl::RemoveChild(const CoordinationUnitID& child_id) { 175 void CoordinationUnitImpl::RemoveChild(const CoordinationUnitID& child_id) {
164 auto child_iter = g_cu_map().find(child_id); 176 auto child_iter = g_cu_map().find(child_id);
165 if (child_iter == g_cu_map().end()) { 177 if (child_iter == g_cu_map().end()) {
166 return; 178 return;
167 } 179 }
168 180
169 CoordinationUnitImpl* child = child_iter->second; 181 CoordinationUnitImpl* child = child_iter->second;
170 if (!HasChild(child)) { 182 if (!HasChild(child)) {
171 return; 183 return;
172 } 184 }
173 185
174 DCHECK(child->id_ == child_id); 186 DCHECK(child->id_ == child_id);
175 DCHECK(child != this); 187 DCHECK(child != this);
176 188
177 if (RemoveChild(child)) { 189 if (RemoveChild(child)) {
178 child->RemoveParent(this); 190 child->RemoveParent(this);
179 } 191 }
180 } 192 }
181 193
182 bool CoordinationUnitImpl::RemoveChild(CoordinationUnitImpl* child) { 194 bool CoordinationUnitImpl::RemoveChild(CoordinationUnitImpl* child) {
183 size_t children_removed = children_.erase(child); 195 size_t children_removed = children_.erase(child);
184 return children_removed > 0; 196 bool success = children_removed > 0;
197
198 if (success) {
199 for (auto* observer :
200 on_child_removed_event_observer_registry_.GetObserversForFilter(
201 child->id().type)) {
202 observer->OnChildRemovedEvent(this, child);
203 }
204 }
205
206 return success;
185 } 207 }
186 208
187 void CoordinationUnitImpl::AddParent(CoordinationUnitImpl* parent) { 209 void CoordinationUnitImpl::AddParent(CoordinationUnitImpl* parent) {
188 DCHECK_EQ(0u, parents_.count(parent)); 210 DCHECK_EQ(0u, parents_.count(parent));
189 parents_.insert(parent); 211 parents_.insert(parent);
190 212
213 for (auto* observer :
214 on_parent_added_event_observer_registry_.GetObserversForFilter(
215 parent->id().type)) {
216 observer->OnParentAddedEvent(this, parent);
217 }
218
191 RecalcCoordinationPolicy(); 219 RecalcCoordinationPolicy();
192 } 220 }
193 221
194 void CoordinationUnitImpl::RemoveParent(CoordinationUnitImpl* parent) { 222 void CoordinationUnitImpl::RemoveParent(CoordinationUnitImpl* parent) {
195 size_t parents_removed = parents_.erase(parent); 223 size_t parents_removed = parents_.erase(parent);
196 DCHECK_EQ(1u, parents_removed); 224 DCHECK_EQ(1u, parents_removed);
197 225
226 // TODO(matthalp, oysteine) should this go before or
227 // after RecalcCoordinationPolicy?
Zhen Wang 2017/06/19 22:54:25 Is this undecided or you intend to ask Oystein for
oystein (OOO til 10th of July) 2017/06/20 18:39:23 Recalc should happen after, though TBH I think we'
matthalp 2017/06/20 19:02:52 RecalcCoordinationPolicy does not do anything righ
matthalp 2017/06/20 19:02:52 Sounds good.
228 for (auto* observer :
229 on_parent_removed_event_observer_registry_.GetObserversForFilter(
230 parent->id().type)) {
231 observer->OnParentRemovedEvent(this, parent);
232 }
233
198 RecalcCoordinationPolicy(); 234 RecalcCoordinationPolicy();
199 } 235 }
200 236
201 bool CoordinationUnitImpl::HasParent(CoordinationUnitImpl* unit) { 237 bool CoordinationUnitImpl::HasParent(CoordinationUnitImpl* unit) {
202 for (CoordinationUnitImpl* parent : parents_) { 238 for (CoordinationUnitImpl* parent : parents_) {
203 if (parent == unit || parent->HasParent(unit)) { 239 if (parent == unit || parent->HasParent(unit)) {
204 return true; 240 return true;
205 } 241 }
206 } 242 }
207 243
(...skipping 23 matching lines...) Expand all
231 267
232 void CoordinationUnitImpl::UnregisterCoordinationPolicyCallback() { 268 void CoordinationUnitImpl::UnregisterCoordinationPolicyCallback() {
233 policy_callback_.reset(); 269 policy_callback_.reset();
234 current_policy_.reset(); 270 current_policy_.reset();
235 } 271 }
236 272
237 double CoordinationUnitImpl::GetCPUUsageForTesting() { 273 double CoordinationUnitImpl::GetCPUUsageForTesting() {
238 return kCPUUsageUnmeasuredForTesting; 274 return kCPUUsageUnmeasuredForTesting;
239 } 275 }
240 276
241 base::Value CoordinationUnitImpl::GetProperty(mojom::PropertyType property) { 277 base::Value CoordinationUnitImpl::GetProperty(
278 mojom::PropertyType property) const {
242 auto value_it = property_store_.find(property); 279 auto value_it = property_store_.find(property);
243 280
244 return value_it != property_store_.end() ? value_it->second : base::Value(); 281 return value_it != property_store_.end() ? value_it->second : base::Value();
245 } 282 }
246 283
247 void CoordinationUnitImpl::ClearProperty(mojom::PropertyType property) { 284 void CoordinationUnitImpl::ClearProperty(mojom::PropertyType property) {
248 property_store_.erase(property); 285 property_store_.erase(property);
249 } 286 }
250 287
251 void CoordinationUnitImpl::SetProperty(mojom::PropertyPtr property) { 288 void CoordinationUnitImpl::SetProperty(mojom::PropertyPtr property) {
252 SetProperty(property->property, *property->value); 289 SetProperty(property->property, *property->value);
253 } 290 }
254 291
255 void CoordinationUnitImpl::SetProperty(mojom::PropertyType property, 292 void CoordinationUnitImpl::SetProperty(mojom::PropertyType property,
256 base::Value value) { 293 base::Value value) {
257 // setting a property with an empty value is effectively clearing the 294 // setting a property with an empty value is effectively clearing the
258 // value from storage 295 // value from storage
259 if (value.IsType(base::Value::Type::NONE)) { 296 if (value.IsType(base::Value::Type::NONE)) {
260 ClearProperty(property); 297 ClearProperty(property);
261 return; 298 return;
262 } 299 }
263 300
264 property_store_[property] = value; 301 property_store_[property] = value;
302
303 for (auto* observer :
304 on_property_changed_event_observer_registry_.GetObserversForFilter(
305 property)) {
306 observer->OnPropertyChangedEvent(this, property);
307 }
308 }
309
310 void CoordinationUnitImpl::WillBeDestroyed() {
311 for (auto* observer : on_will_be_destroyed_event_observer_registry_
312 .GetObserversWithoutAFilter()) {
313 observer->OnWillBeDestroyedEvent(this);
314 }
315 }
316
317 void CoordinationUnitImpl::ObserveOnChildAddedEvent(
318 CoordinationUnitGraphObserver* observer,
319 CoordinationUnitType child_filter) {
320 on_child_added_event_observer_registry_.AddObserver(observer, child_filter);
321 }
322
323 void CoordinationUnitImpl::ObserveOnChildAddedEvent(
324 CoordinationUnitGraphObserver* observer) {
325 ObserveOnChildAddedEvent(
326 observer,
327 CoordinationUnitGraphObserverRegistry<CoordinationUnitType>::kNoFilter);
328 }
329
330 void CoordinationUnitImpl::ObserveOnParentAddedEvent(
331 CoordinationUnitGraphObserver* observer,
332 CoordinationUnitType parent_filter) {
333 on_parent_added_event_observer_registry_.AddObserver(observer, parent_filter);
334 }
335
336 void CoordinationUnitImpl::ObserveOnParentAddedEvent(
337 CoordinationUnitGraphObserver* observer) {
338 ObserveOnParentAddedEvent(
339 observer,
340 CoordinationUnitGraphObserverRegistry<CoordinationUnitType>::kNoFilter);
341 }
342
343 void CoordinationUnitImpl::ObserveOnPropertyChangedEvent(
344 CoordinationUnitGraphObserver* observer,
345 mojom::PropertyType property_filter) {
346 on_property_changed_event_observer_registry_.AddObserver(observer,
347 property_filter);
348 }
349
350 void CoordinationUnitImpl::ObserveOnPropertyChangedEvent(
351 CoordinationUnitGraphObserver* observer) {
352 ObserveOnPropertyChangedEvent(
353 observer,
354 CoordinationUnitGraphObserverRegistry<mojom::PropertyType>::kNoFilter);
355 }
356
357 void CoordinationUnitImpl::ObserveOnChildRemovedEvent(
358 CoordinationUnitGraphObserver* observer,
359 CoordinationUnitType child_filter) {
360 on_child_removed_event_observer_registry_.AddObserver(observer, child_filter);
361 }
362
363 void CoordinationUnitImpl::ObserveOnChildRemovedEvent(
364 CoordinationUnitGraphObserver* observer) {
365 ObserveOnChildRemovedEvent(
366 observer,
367 CoordinationUnitGraphObserverRegistry<CoordinationUnitType>::kNoFilter);
368 }
369
370 void CoordinationUnitImpl::ObserveOnParentRemovedEvent(
371 CoordinationUnitGraphObserver* observer,
372 CoordinationUnitType parent_filter) {
373 on_parent_removed_event_observer_registry_.AddObserver(observer,
374 parent_filter);
375 }
376
377 void CoordinationUnitImpl::ObserveOnParentRemovedEvent(
378 CoordinationUnitGraphObserver* observer) {
379 ObserveOnParentRemovedEvent(
380 observer,
381 CoordinationUnitGraphObserverRegistry<CoordinationUnitType>::kNoFilter);
382 }
383
384 void CoordinationUnitImpl::ObserveOnWillBeDestroyedEvent(
385 CoordinationUnitGraphObserver* observer) {
386 on_will_be_destroyed_event_observer_registry_.AddObserver(observer);
265 } 387 }
266 388
267 } // namespace resource_coordinator 389 } // namespace resource_coordinator
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698