Ping? -- Lucas De Marchi
On Wed, Feb 18, 2015 at 2:22 PM, <lucas.de.mar...@gmail.com> wrote: > From: Lucas De Marchi <lucas.demar...@intel.com> > > By notifying the clients when this property is changed it's possible to > allow "system health monitor" tools to get transitions like > running<->degraded. This is an alternative to send changes on the > SystemState property since the latter is more difficult to derive. > --- > src/core/dbus-manager.c | 20 +++++++++++++++++++- > src/core/dbus-manager.h | 1 + > src/core/manager.c | 17 +++++++++++++++++ > src/core/manager.h | 2 ++ > src/core/unit.c | 7 ++----- > 5 files changed, 41 insertions(+), 6 deletions(-) > > diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c > index 8ba665d..5e83afb 100644 > --- a/src/core/dbus-manager.c > +++ b/src/core/dbus-manager.c > @@ -1949,7 +1949,7 @@ const sd_bus_vtable bus_manager_vtable[] = { > SD_BUS_WRITABLE_PROPERTY("LogLevel", "s", property_get_log_level, > property_set_log_level, 0, 0), > SD_BUS_WRITABLE_PROPERTY("LogTarget", "s", property_get_log_target, > property_set_log_target, 0, 0), > SD_BUS_PROPERTY("NNames", "u", property_get_n_names, 0, 0), > - SD_BUS_PROPERTY("NFailedUnits", "u", property_get_n_failed_units, 0, > 0), > + SD_BUS_PROPERTY("NFailedUnits", "u", property_get_n_failed_units, 0, > SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), > SD_BUS_PROPERTY("NJobs", "u", property_get_n_jobs, 0, 0), > SD_BUS_PROPERTY("NInstalledJobs", "u", bus_property_get_unsigned, > offsetof(Manager, n_installed_jobs), 0), > SD_BUS_PROPERTY("NFailedJobs", "u", bus_property_get_unsigned, > offsetof(Manager, n_failed_jobs), 0), > @@ -2102,5 +2102,23 @@ void bus_manager_send_reloading(Manager *m, bool > active) { > r = bus_foreach_bus(m, NULL, send_reloading, INT_TO_PTR(active)); > if (r < 0) > log_debug_errno(r, "Failed to send reloading signal: %m"); > +} > + > +static int send_changed_signal(sd_bus *bus, void *userdata) { > + assert(bus); > + > + return sd_bus_emit_properties_changed_strv(bus, > + > "/org/freedesktop/systemd1", > + > "org.freedesktop.systemd1.Manager", > + NULL); > +} > > +void bus_manager_send_change_signal(Manager *m) { > + int r; > + > + assert(m); > + > + r = bus_foreach_bus(m, NULL, send_changed_signal, NULL); > + if (r < 0) > + log_debug_errno(r, "Failed to send manager change signal: > %m"); > } > diff --git a/src/core/dbus-manager.h b/src/core/dbus-manager.h > index e1903fa..3f7cfef 100644 > --- a/src/core/dbus-manager.h > +++ b/src/core/dbus-manager.h > @@ -28,3 +28,4 @@ extern const sd_bus_vtable bus_manager_vtable[]; > > void bus_manager_send_finished(Manager *m, usec_t firmware_usec, usec_t > loader_usec, usec_t kernel_usec, usec_t initrd_usec, usec_t userspace_usec, > usec_t total_usec); > void bus_manager_send_reloading(Manager *m, bool active); > +void bus_manager_send_change_signal(Manager *m); > diff --git a/src/core/manager.c b/src/core/manager.c > index 4775219..0e9e154 100644 > --- a/src/core/manager.c > +++ b/src/core/manager.c > @@ -3061,6 +3061,23 @@ const char *manager_get_runtime_prefix(Manager *m) { > getenv("XDG_RUNTIME_DIR"); > } > > +void manager_update_failed_units(Manager *m, Unit *u, bool failed) { > + unsigned size; > + > + assert(m); > + assert(u->manager == m); > + > + size = set_size(m->failed_units); > + > + if (failed) > + set_put(m->failed_units, u); > + else > + set_remove(m->failed_units, u); > + > + if (set_size(m->failed_units) != size) > + bus_manager_send_change_signal(m); > +} > + > ManagerState manager_state(Manager *m) { > Unit *u; > > diff --git a/src/core/manager.h b/src/core/manager.h > index d3971f1..418b752 100644 > --- a/src/core/manager.h > +++ b/src/core/manager.h > @@ -367,5 +367,7 @@ const char *manager_get_runtime_prefix(Manager *m); > > ManagerState manager_state(Manager *m); > > +void manager_update_failed_units(Manager *m, Unit *u, bool failed); > + > const char *manager_state_to_string(ManagerState m) _const_; > ManagerState manager_state_from_string(const char *s) _pure_; > diff --git a/src/core/unit.c b/src/core/unit.c > index ee8e607..ec45ec9 100644 > --- a/src/core/unit.c > +++ b/src/core/unit.c > @@ -522,7 +522,7 @@ void unit_free(Unit *u) { > free(u->cgroup_path); > } > > - set_remove(u->manager->failed_units, u); > + manager_update_failed_units(u->manager, u, false); > set_remove(u->manager->startup_units, u); > > free(u->description); > @@ -1801,10 +1801,7 @@ void unit_notify(Unit *u, UnitActiveState os, > UnitActiveState ns, bool reload_su > } > > /* Keep track of failed units */ > - if (ns == UNIT_FAILED) > - set_put(u->manager->failed_units, u); > - else > - set_remove(u->manager->failed_units, u); > + manager_update_failed_units(u->manager, u, ns == UNIT_FAILED); > > /* Make sure the cgroup is always removed when we become inactive */ > if (UNIT_IS_INACTIVE_OR_FAILED(ns)) > -- > 2.3.0 > _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel