X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fdbus-unit.c;h=519aa5c3e8b0a7cee69fd8d65d5641b653e53441;hb=50f74deea32476c3e19cda870857782576587d94;hp=2d5924219cd22ddf718efa5d4c2bc03c73208017;hpb=b5e9dba8d60b8fb80b6302b6ea2cd665b3ab370c;p=elogind.git diff --git a/src/dbus-unit.c b/src/dbus-unit.c index 2d5924219..519aa5c3e 100644 --- a/src/dbus-unit.c +++ b/src/dbus-unit.c @@ -1,4 +1,4 @@ -/*-*- Mode: C; c-basic-offset: 8 -*-*/ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ /*** This file is part of systemd. @@ -28,6 +28,18 @@ const char bus_unit_interface[] = BUS_UNIT_INTERFACE; +#define INVALIDATING_PROPERTIES \ + "LoadState\0" \ + "ActiveState\0" \ + "SubState\0" \ + "InactiveExitTimestamp\0" \ + "ActiveEnterTimestamp\0" \ + "ActiveExitTimestamp\0" \ + "InactiveEnterTimestamp\0" \ + "Job\0" \ + "NeedDaemonReload\0" \ + "\0" + int bus_unit_append_names(Manager *m, DBusMessageIter *i, const char *property, void *data) { char *t; Iterator j; @@ -470,10 +482,27 @@ void bus_unit_send_change_signal(Unit *u) { goto oom; if (u->meta.sent_dbus_new_signal) { - /* Send a change signal */ + /* Send a properties changed signal. First for the + * specific type, then for the generic unit. The + * clients may rely on this order to get atomic + * behaviour if needed. */ + + if (UNIT_VTABLE(u)->bus_invalidating_properties) { + + if (!(m = bus_properties_changed_new(p, + UNIT_VTABLE(u)->bus_interface, + UNIT_VTABLE(u)->bus_invalidating_properties))) + goto oom; + + if (bus_broadcast(u->meta.manager, m) < 0) + goto oom; - if (!(m = dbus_message_new_signal(p, "org.freedesktop.systemd1.Unit", "Changed"))) + dbus_message_unref(m); + } + + if (!(m = bus_properties_changed_new(p, "org.freedesktop.systemd1.Unit", INVALIDATING_PROPERTIES))) goto oom; + } else { /* Send a new signal */