X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=dbus.c;h=0054d1519e3bfdfd936dc0edec533f7b4a52063e;hp=79b1a7ebc39b529c127be37a76cdf5e893e2695c;hb=3a76266192da84f6f7b84725e7647c82f8407278;hpb=4139c1b2729f88991159b9affa2ebf3e4eb904a0 diff --git a/dbus.c b/dbus.c index 79b1a7ebc..0054d1519 100644 --- a/dbus.c +++ b/dbus.c @@ -381,6 +381,18 @@ static DBusHandlerResult system_bus_message_filter(DBusConnection *connection, unsigned bus_dispatch(Manager *m) { assert(m); + if (m->queued_message) { + /* If we cannot get rid of this message we won't + * dispatch any D-Bus messages, so that we won't end + * up wanting to queue another message. */ + + if (!dbus_connection_send(m->api_bus, m->queued_message, NULL)) + return 0; + + dbus_message_unref(m->queued_message); + m->queued_message = NULL; + } + if (m->request_api_bus_dispatch) { if (dbus_connection_dispatch(m->api_bus) == DBUS_DISPATCH_COMPLETE) m->request_api_bus_dispatch = false; @@ -637,6 +649,7 @@ void bus_done_api(Manager *m) { m->system_bus = NULL; dbus_connection_set_dispatch_status_function(m->api_bus, NULL, NULL, NULL); + dbus_connection_flush(m->api_bus); dbus_connection_close(m->api_bus); dbus_connection_unref(m->api_bus); m->api_bus = NULL; @@ -654,6 +667,11 @@ void bus_done_api(Manager *m) { if (m->name_data_slot >= 0) dbus_pending_call_free_data_slot(&m->name_data_slot); + + if (m->queued_message) { + dbus_message_unref(m->queued_message); + m->queued_message = NULL; + } } void bus_done_system(Manager *m) { @@ -664,6 +682,7 @@ void bus_done_system(Manager *m) { if (m->system_bus) { dbus_connection_set_dispatch_status_function(m->system_bus, NULL, NULL, NULL); + dbus_connection_flush(m->system_bus); dbus_connection_close(m->system_bus); dbus_connection_unref(m->system_bus); m->system_bus = NULL;