From 90f4fdb0718f4cdef717c555fe2ed81ff59f6fce Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 6 Apr 2009 02:31:22 +0200 Subject: [PATCH] make sure we keep a reference of the bus connection during the whole runtime if we manage to acquire the bus name --- src/daemon/main.c | 36 +++++++++++++++++++++++++++--------- src/pulsecore/dbus-util.c | 5 +++-- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/daemon/main.c b/src/daemon/main.c index d25647c..4c4a905 100644 --- a/src/daemon/main.c +++ b/src/daemon/main.c @@ -334,27 +334,38 @@ static void set_all_rlimits(const pa_daemon_conf *conf) { #endif #ifdef HAVE_DBUS -static void register_org_pulseaudio(pa_core *c) -{ +static pa_dbus_connection *register_dbus(pa_core *c) { DBusError error; pa_dbus_connection *conn; dbus_error_init(&error); + if (!(conn = pa_dbus_bus_get(c, pa_in_system_mode() ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, &error)) || dbus_error_is_set(&error)) { - pa_log_warn("Unable to contact DBUS: %s: %s", error.name, error.message); - goto finish_dbus; + pa_log_warn("Unable to contact D-Bus: %s: %s", error.name, error.message); + goto fail; } - if (dbus_bus_request_name (pa_dbus_connection_get(conn), "org.pulseaudio.Server", DBUS_NAME_FLAG_DO_NOT_QUEUE, &error) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) + if (dbus_bus_request_name(pa_dbus_connection_get(conn), "org.pulseaudio.Server", DBUS_NAME_FLAG_DO_NOT_QUEUE, &error) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { pa_log_debug("Got org.pulseaudio.Server!"); - else if (dbus_error_is_set(&error)) - pa_log_warn("Unable to get org.pulseaudio.Server: %s: %s", error.name, error.message); + return conn; + } + + if (dbus_error_is_set(&error)) + pa_log_warn("Failed to acquire org.pulseaudio.Server: %s: %s", error.name, error.message); + else + pa_log_warn("D-Bus name org.pulseaudio.Server already taken. Weird shit!"); + + /* PA cannot be started twice by the same user and hence we can + * ignore mostly the case that org.pulseaudio.Server is already + * taken. */ + +fail: -finish_dbus: if (conn) pa_dbus_connection_unref(conn); dbus_error_free(&error); + return NULL; } #endif @@ -380,6 +391,9 @@ int main(int argc, char *argv[]) { #endif int autospawn_fd = -1; pa_bool_t autospawn_locked = FALSE; +#ifdef HAVE_DBUS + pa_dbus_connection *dbus = NULL; +#endif pa_log_set_ident("pulseaudio"); pa_log_set_level(PA_LOG_INFO); @@ -1026,7 +1040,7 @@ int main(int argc, char *argv[]) { #endif #ifdef HAVE_DBUS - register_org_pulseaudio(c); + dbus = register_dbus(c); #endif pa_log_info(_("Daemon startup complete.")); @@ -1038,6 +1052,10 @@ int main(int argc, char *argv[]) { pa_log_info(_("Daemon shutdown initiated.")); finish: +#ifdef HAVE_DBUS + if (dbus) + pa_dbus_connection_unref(dbus); +#endif if (autospawn_fd >= 0) { if (autospawn_locked) diff --git a/src/pulsecore/dbus-util.c b/src/pulsecore/dbus-util.c index d712bff..7302867 100644 --- a/src/pulsecore/dbus-util.c +++ b/src/pulsecore/dbus-util.c @@ -244,7 +244,7 @@ static void wakeup_main(void *userdata) { pa_dbus_wrap_connection* pa_dbus_wrap_connection_new(pa_mainloop_api *m, DBusBusType type, DBusError *error) { DBusConnection *conn; - pa_dbus_wrap_connection *pconn = NULL; + pa_dbus_wrap_connection *pconn; pa_assert(type == DBUS_BUS_SYSTEM || type == DBUS_BUS_SESSION || type == DBUS_BUS_STARTER); @@ -273,7 +273,8 @@ void pa_dbus_wrap_connection_free(pa_dbus_wrap_connection* c) { dbus_connection_close(c->connection); /* must process remaining messages, bit of a kludge to handle * both unload and shutdown */ - while (dbus_connection_read_write_dispatch(c->connection, -1)); + while (dbus_connection_read_write_dispatch(c->connection, -1)) + ; } c->mainloop->defer_free(c->dispatch_event); -- 2.7.4