core: while we are reloading don't suppress bus signals

While we are reloading we shouldn't suppress adding units to the bus
queue when there are no subscribers, simply because we might not have
deserialized the subscribers list yet. Hence, during reloading always
assume we have subscribers.
This commit is contained in:
Lennart Poettering 2013-07-10 20:33:11 +02:00
parent 6fa4853328
commit b170dd803d
2 changed files with 38 additions and 20 deletions

View file

@ -568,8 +568,9 @@ const DBusObjectPathVTable bus_unit_vtable = {
};
void bus_unit_send_change_signal(Unit *u) {
_cleanup_free_ char *p = NULL;
_cleanup_dbus_message_unref_ DBusMessage *m = NULL;
_cleanup_free_ char *p = NULL;
int r;
assert(u);
@ -587,8 +588,10 @@ void bus_unit_send_change_signal(Unit *u) {
}
p = unit_dbus_path(u);
if (!p)
goto oom;
if (!p) {
log_oom();
return;
}
if (u->sent_dbus_new_signal) {
/* Send a properties changed signal. First for the
@ -601,19 +604,26 @@ void bus_unit_send_change_signal(Unit *u) {
m = bus_properties_changed_new(p,
UNIT_VTABLE(u)->bus_interface,
UNIT_VTABLE(u)->bus_invalidating_properties);
if (!m)
goto oom;
if (!m) {
log_oom();
return;
}
if (bus_broadcast(u->manager, m) < 0)
goto oom;
r = bus_broadcast(u->manager, m);
if (r < 0) {
log_error("Failed to broadcast change message: %s", strerror(-r));
return;
}
dbus_message_unref(m);
}
m = bus_properties_changed_new(p, "org.freedesktop.systemd1.Unit",
INVALIDATING_PROPERTIES);
if (!m)
goto oom;
if (!m) {
log_oom();
return;
}
} else {
/* Send a new signal */
@ -621,25 +631,27 @@ void bus_unit_send_change_signal(Unit *u) {
m = dbus_message_new_signal("/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
"UnitNew");
if (!m)
goto oom;
if (!m) {
log_oom();
return;
}
if (!dbus_message_append_args(m,
DBUS_TYPE_STRING, &u->id,
DBUS_TYPE_OBJECT_PATH, &p,
DBUS_TYPE_INVALID))
goto oom;
DBUS_TYPE_INVALID)) {
log_oom();
return;
}
}
if (bus_broadcast(u->manager, m) < 0)
goto oom;
r = bus_broadcast(u->manager, m);
if (r < 0) {
log_error("Failed to broadcast UnitNew/PropertiesChanged message.");
return;
}
u->sent_dbus_new_signal = true;
return;
oom:
log_oom();
}
void bus_unit_send_removed_signal(Unit *u) {

View file

@ -1379,6 +1379,12 @@ bool bus_has_subscriber(Manager *m) {
assert(m);
/* If we are reloading then we might not have deserialized the
subscribers yet, hence let's assume that there are some */
if (m->n_reloading > 0)
return true;
SET_FOREACH(c, m->bus_connections_for_dispatch, i)
if (bus_connection_has_subscriber(m, c))
return true;