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

Unified Diff: services/resource_coordinator/coordination_unit/coordination_unit_impl.h

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 side-by-side diff with in-line comments
Download patch
Index: services/resource_coordinator/coordination_unit/coordination_unit_impl.h
diff --git a/services/resource_coordinator/coordination_unit/coordination_unit_impl.h b/services/resource_coordinator/coordination_unit/coordination_unit_impl.h
index 94ebb044e624c8a0b0f6217f2b7e71e05ed5a62d..18a40a007a02bdd7f9c3c90b2ef2bbf68f6acac0 100644
--- a/services/resource_coordinator/coordination_unit/coordination_unit_impl.h
+++ b/services/resource_coordinator/coordination_unit/coordination_unit_impl.h
@@ -6,24 +6,100 @@
#define SERVICES_RESOURCE_COORDINATOR_COORDINATION_UNIT_COORDINATION_UNIT_IMPL_H_
#include <list>
+#include <map>
#include <memory>
#include <set>
#include <unordered_map>
#include <utility>
+#include <vector>
+#include "base/callback.h"
#include "base/optional.h"
#include "base/values.h"
#include "mojo/public/cpp/bindings/binding_set.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
#include "services/resource_coordinator/public/cpp/coordination_unit_id.h"
+#include "services/resource_coordinator/public/cpp/coordination_unit_types.h"
#include "services/resource_coordinator/public/interfaces/coordination_unit.mojom.h"
#include "services/resource_coordinator/public/interfaces/coordination_unit_provider.mojom.h"
#include "services/service_manager/public/cpp/service_context_ref.h"
namespace resource_coordinator {
+// Collection to manage CoordinationUnitEvent listeners.
+template <typename Listener, typename Filter>
+class CoordinationUnitEventListenerRegistry {
+ public:
+ CoordinationUnitEventListenerRegistry() = default;
+ ~CoordinationUnitEventListenerRegistry() = default;
+
+ // callbacks paired with this kNoFilter will always be invoked
+ static const Filter kNoFilter = static_cast<Filter>(0);
+
+ void AddListener(Listener listener, Filter filter) {
+ registry_[filter].push_back(listener);
+ }
+
+ void AddListener(Listener listener) { AddListener(listener, kNoFilter); }
+
+ // Get the listeners who are are either registered to be invoked for a
+ // specific filter or were registered with the kNoFilter.
+ // TODO(matthalp) add iterator support to replace this call and
+ // avoid excessive copying that currently occurs
+ std::vector<Listener> GetListeners(Filter filter) {
+ std::vector<Listener> listeners;
+
+ // Get listeners registered with a listener first.
+ AppendListeners(&listeners, filter);
+
+ // Get listeners registered without a filter after.
+ if (filter != kNoFilter) {
+ AppendListeners(&listeners, kNoFilter);
+ }
+
+ return listeners;
+ }
+
+ std::vector<Listener> GetListenersWithoutAFilter() {
+ return GetListeners(kNoFilter);
+ }
+
+ private:
+ // TODO(matthalp) Consider using a std::unordered_map instead.
+ std::map<Filter, std::vector<Listener>> registry_;
+
+ void AppendListeners(std::vector<Listener>* listeners, Filter filter) {
+ listeners->insert(listeners->end(), registry_[filter].begin(),
+ registry_[filter].end());
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(CoordinationUnitEventListenerRegistry);
+};
+
class CoordinationUnitImpl : public mojom::CoordinationUnit {
+ typedef base::Callback<void(
+ const CoordinationUnitImpl* coordination_unit,
+ const CoordinationUnitImpl* child_coordination_unit)>
+ OnAddChildEventListener;
+ typedef base::Callback<void(
+ const CoordinationUnitImpl* coordination_unit,
+ const CoordinationUnitImpl* parent_coordination_unit)>
+ OnAddParentEventListener;
+ typedef base::Callback<void(
+ const CoordinationUnitImpl* coordination_unit,
+ const CoordinationUnitImpl* removed_child_coordination_unit)>
+ OnRemoveChildEventListener;
+ typedef base::Callback<void(
+ const CoordinationUnitImpl* coordination_unit,
+ const CoordinationUnitImpl* removed_parent_coordination_unit)>
+ OnRemoveParentEventListener;
+ typedef base::Callback<void(const CoordinationUnitImpl* coordination_unit,
+ mojom::PropertyType property)>
+ OnPropertyChangedEventListener;
+ typedef base::Callback<void(const CoordinationUnitImpl* coordination_unit)>
+ OnWillBeDestroyedEventListener;
+
public:
CoordinationUnitImpl(
const CoordinationUnitID& id,
@@ -55,10 +131,45 @@ class CoordinationUnitImpl : public mojom::CoordinationUnit {
// Clear property from internal key-value store
void ClearProperty(mojom::PropertyType property);
// Retrieve property from internal key-value store
- base::Value GetProperty(mojom::PropertyType property);
+ base::Value GetProperty(mojom::PropertyType property) const;
// Set property from internal key-value store
void SetProperty(mojom::PropertyType property, base::Value value);
+ // Notify an instance it will be destroyed before its destructor is
+ // actually called.
+ void WillBeDestroyed();
+
+ CoordinationUnitEventListenerRegistry<OnAddChildEventListener,
+ CoordinationUnitType>&
+ on_add_child_event_listeners() {
+ return on_add_child_event_listeners_;
+ }
+ CoordinationUnitEventListenerRegistry<OnAddParentEventListener,
+ CoordinationUnitType>&
+ on_add_parent_event_listeners() {
+ return on_add_parent_event_listeners_;
+ }
+ CoordinationUnitEventListenerRegistry<OnRemoveChildEventListener,
+ CoordinationUnitType>&
+ on_remove_child_event_listeners() {
+ return on_remove_child_event_listeners_;
+ }
+ CoordinationUnitEventListenerRegistry<OnRemoveParentEventListener,
+ CoordinationUnitType>&
+ on_remove_parent_event_listeners() {
+ return on_remove_parent_event_listeners_;
+ }
+ CoordinationUnitEventListenerRegistry<OnPropertyChangedEventListener,
+ mojom::PropertyType>&
+ on_property_changed_event_listeners() {
+ return on_property_changed_event_listeners_;
+ }
+ CoordinationUnitEventListenerRegistry<OnWillBeDestroyedEventListener,
+ CoordinationUnitType>&
+ on_will_be_destroyed_event_listeners() {
+ return on_will_be_destroyed_event_listeners_;
+ }
+
protected:
const CoordinationUnitID id_;
std::set<CoordinationUnitImpl*> children_;
@@ -94,6 +205,27 @@ class CoordinationUnitImpl : public mojom::CoordinationUnit {
base::Optional<bool> state_flags_[kNumStateFlags];
+ CoordinationUnitEventListenerRegistry<OnAddChildEventListener,
+ CoordinationUnitType>
+ on_add_child_event_listeners_;
+ CoordinationUnitEventListenerRegistry<OnAddParentEventListener,
+ CoordinationUnitType>
+ on_add_parent_event_listeners_;
+ CoordinationUnitEventListenerRegistry<OnRemoveChildEventListener,
+ CoordinationUnitType>
+ on_remove_child_event_listeners_;
+ CoordinationUnitEventListenerRegistry<OnRemoveParentEventListener,
+ CoordinationUnitType>
+ on_remove_parent_event_listeners_;
+ CoordinationUnitEventListenerRegistry<OnPropertyChangedEventListener,
+ mojom::PropertyType>
+ on_property_changed_event_listeners_;
+ // There is nothing to filter WillBeDestroyedEventCallbacks on so the
+ // CoordinationUnitType is used as a filter placeholder
+ CoordinationUnitEventListenerRegistry<OnWillBeDestroyedEventListener,
+ CoordinationUnitType>
+ on_will_be_destroyed_event_listeners_;
+
DISALLOW_COPY_AND_ASSIGN(CoordinationUnitImpl);
};

Powered by Google App Engine
This is Rietveld 408576698