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

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

Issue 2926663003: [GRC] Coordination Unit Graph Observer (Closed)
Patch Set: Rebase 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
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 if (AddChild(child)) { 150 if (AddChild(child)) {
151 child->AddParent(this); 151 child->AddParent(this);
152 } 152 }
153 } 153 }
154 } 154 }
155 155
156 bool CoordinationUnitImpl::AddChild(CoordinationUnitImpl* child) { 156 bool CoordinationUnitImpl::AddChild(CoordinationUnitImpl* child) {
157 // We don't recalculate the policy here as policies are only dependent 157 // 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, 158 // on the current CU or its parents, not its children. In other words,
159 // policies only bubble down. 159 // policies only bubble down.
160 return children_.count(child) ? false : children_.insert(child).second; 160 bool success =
161 children_.count(child) ? false : children_.insert(child).second;
162
163 if (success) {
164 for (auto listener :
165 on_add_child_event_listeners_.GetListeners(child->id().type)) {
166 listener.Run(this, child);
167 }
168 }
169
170 return success;
161 } 171 }
162 172
163 void CoordinationUnitImpl::RemoveChild(const CoordinationUnitID& child_id) { 173 void CoordinationUnitImpl::RemoveChild(const CoordinationUnitID& child_id) {
164 auto child_iter = g_cu_map().find(child_id); 174 auto child_iter = g_cu_map().find(child_id);
165 if (child_iter == g_cu_map().end()) { 175 if (child_iter == g_cu_map().end()) {
166 return; 176 return;
167 } 177 }
168 178
169 CoordinationUnitImpl* child = child_iter->second; 179 CoordinationUnitImpl* child = child_iter->second;
170 if (!HasChild(child)) { 180 if (!HasChild(child)) {
171 return; 181 return;
172 } 182 }
173 183
174 DCHECK(child->id_ == child_id); 184 DCHECK(child->id_ == child_id);
175 DCHECK(child != this); 185 DCHECK(child != this);
176 186
177 if (RemoveChild(child)) { 187 if (RemoveChild(child)) {
178 child->RemoveParent(this); 188 child->RemoveParent(this);
179 } 189 }
180 } 190 }
181 191
182 bool CoordinationUnitImpl::RemoveChild(CoordinationUnitImpl* child) { 192 bool CoordinationUnitImpl::RemoveChild(CoordinationUnitImpl* child) {
183 size_t children_removed = children_.erase(child); 193 size_t children_removed = children_.erase(child);
184 return children_removed > 0; 194 bool success = children_removed > 0;
195
196 if (success) {
197 for (auto listener :
198 on_remove_child_event_listeners_.GetListeners(child->id().type)) {
199 listener.Run(this, child);
200 }
201 }
202
203 return success;
185 } 204 }
186 205
187 void CoordinationUnitImpl::AddParent(CoordinationUnitImpl* parent) { 206 void CoordinationUnitImpl::AddParent(CoordinationUnitImpl* parent) {
188 DCHECK_EQ(0u, parents_.count(parent)); 207 DCHECK_EQ(0u, parents_.count(parent));
189 parents_.insert(parent); 208 parents_.insert(parent);
190 209
210 for (auto listener :
211 on_add_parent_event_listeners_.GetListeners(parent->id().type)) {
212 listener.Run(this, parent);
213 }
214
191 RecalcCoordinationPolicy(); 215 RecalcCoordinationPolicy();
192 } 216 }
193 217
194 void CoordinationUnitImpl::RemoveParent(CoordinationUnitImpl* parent) { 218 void CoordinationUnitImpl::RemoveParent(CoordinationUnitImpl* parent) {
195 size_t parents_removed = parents_.erase(parent); 219 size_t parents_removed = parents_.erase(parent);
196 DCHECK_EQ(1u, parents_removed); 220 DCHECK_EQ(1u, parents_removed);
197 221
222 // TODO(matthalp, oysteine) should this go before or
223 // after RecalcCoordinationPolicy?
224 for (auto listener :
225 on_remove_parent_event_listeners_.GetListeners(parent->id().type)) {
226 listener.Run(this, parent);
227 }
228
198 RecalcCoordinationPolicy(); 229 RecalcCoordinationPolicy();
199 } 230 }
200 231
201 bool CoordinationUnitImpl::HasParent(CoordinationUnitImpl* unit) { 232 bool CoordinationUnitImpl::HasParent(CoordinationUnitImpl* unit) {
202 for (CoordinationUnitImpl* parent : parents_) { 233 for (CoordinationUnitImpl* parent : parents_) {
203 if (parent == unit || parent->HasParent(unit)) { 234 if (parent == unit || parent->HasParent(unit)) {
204 return true; 235 return true;
205 } 236 }
206 } 237 }
207 238
(...skipping 23 matching lines...) Expand all
231 262
232 void CoordinationUnitImpl::UnregisterCoordinationPolicyCallback() { 263 void CoordinationUnitImpl::UnregisterCoordinationPolicyCallback() {
233 policy_callback_.reset(); 264 policy_callback_.reset();
234 current_policy_.reset(); 265 current_policy_.reset();
235 } 266 }
236 267
237 double CoordinationUnitImpl::GetCPUUsageForTesting() { 268 double CoordinationUnitImpl::GetCPUUsageForTesting() {
238 return kCPUUsageUnmeasuredForTesting; 269 return kCPUUsageUnmeasuredForTesting;
239 } 270 }
240 271
241 base::Value CoordinationUnitImpl::GetProperty(mojom::PropertyType property) { 272 base::Value CoordinationUnitImpl::GetProperty(
273 mojom::PropertyType property) const {
242 auto value_it = property_store_.find(property); 274 auto value_it = property_store_.find(property);
243 275
244 return value_it != property_store_.end() ? value_it->second : base::Value(); 276 return value_it != property_store_.end() ? value_it->second : base::Value();
245 } 277 }
246 278
247 void CoordinationUnitImpl::ClearProperty(mojom::PropertyType property) { 279 void CoordinationUnitImpl::ClearProperty(mojom::PropertyType property) {
248 property_store_.erase(property); 280 property_store_.erase(property);
249 } 281 }
250 282
251 void CoordinationUnitImpl::SetProperty(mojom::PropertyPtr property) { 283 void CoordinationUnitImpl::SetProperty(mojom::PropertyPtr property) {
252 SetProperty(property->property, *property->value); 284 SetProperty(property->property, *property->value);
253 } 285 }
254 286
255 void CoordinationUnitImpl::SetProperty(mojom::PropertyType property, 287 void CoordinationUnitImpl::SetProperty(mojom::PropertyType property,
256 base::Value value) { 288 base::Value value) {
257 // setting a property with an empty value is effectively clearing the 289 // setting a property with an empty value is effectively clearing the
258 // value from storage 290 // value from storage
259 if (value.IsType(base::Value::Type::NONE)) { 291 if (value.IsType(base::Value::Type::NONE)) {
260 ClearProperty(property); 292 ClearProperty(property);
261 return; 293 return;
262 } 294 }
263 295
264 property_store_[property] = value; 296 property_store_[property] = value;
297
298 for (auto listener :
299 on_property_changed_event_listeners_.GetListeners(property)) {
300 listener.Run(this, property);
301 }
302 }
303
304 void CoordinationUnitImpl::WillBeDestroyed() {
305 for (auto listener :
306 on_will_be_destroyed_event_listeners_.GetListenersWithoutAFilter()) {
307 listener.Run(this);
308 }
265 } 309 }
266 310
267 } // namespace resource_coordinator 311 } // namespace resource_coordinator
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698