On Thu, Feb 26, 2015 at 12:31:50AM -0300, Lucas De Marchi wrote: > 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. Looks good. Applied.
Zbyszek > > --- > > 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 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel