From: Mikel Astiz <mikel.astiz@xxxxxxxxxxxx> Extend the reserve-monitor API with a registration mechanism to keep track of existing private connections. This is necessary because the monitor should not consider it busy if a device has been owned by us. --- src/modules/reserve-monitor.c | 29 +++++++++++++++++++++++++---- src/modules/reserve-monitor.h | 7 +++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/modules/reserve-monitor.c b/src/modules/reserve-monitor.c index efd24eb..8942de1 100644 --- a/src/modules/reserve-monitor.c +++ b/src/modules/reserve-monitor.c @@ -41,6 +41,7 @@ struct rm_monitor { char *match; DBusConnection *connection; + DBusConnection *rd_private_bus; unsigned busy:1; unsigned filtering:1; @@ -60,7 +61,7 @@ struct rm_monitor { "arg0='%s'" static unsigned get_busy( - DBusConnection *c, + rm_monitor *m, const char *name_owner) { const char *un; @@ -69,7 +70,12 @@ static unsigned get_busy( return FALSE; /* If we ourselves own the device, then don't consider this 'busy' */ - if ((un = dbus_bus_get_unique_name(c))) + if ((un = dbus_bus_get_unique_name(m->connection))) + if (strcmp(name_owner, un) == 0) + return FALSE; + + /* Similarly, check if the rd_device owns it */ + if (m->rd_private_bus && (un = dbus_bus_get_unique_name(m->rd_private_bus))) if (strcmp(name_owner, un) == 0) return FALSE; @@ -104,7 +110,7 @@ static DBusHandlerResult filter_handler( if (strcmp(name, m->service_name) == 0) { unsigned old_busy = m->busy; - m->busy = get_busy(c, new); + m->busy = get_busy(m, new); if (m->busy != old_busy && m->change_cb) { m->ref++; @@ -246,7 +252,7 @@ int rm_watch( if ((r = get_name_owner(m->connection, m->service_name, &name_owner, error)) < 0) goto fail; - m->busy = get_busy(m->connection, name_owner); + m->busy = get_busy(m, name_owner); free(name_owner); *_m = m; @@ -290,6 +296,9 @@ void rm_release(rm_monitor *m) { if (m->connection) dbus_connection_unref(m->connection); + if (m->rd_private_bus) + dbus_connection_unref(m->rd_private_bus); + free(m); } @@ -320,3 +329,15 @@ void* rm_get_userdata(rm_monitor *m) { return m->userdata; } + +void rm_set_rd_private_bus(rm_monitor *m, DBusConnection *c) { + + if (!m) + return; + + if (m->rd_private_bus) + dbus_connection_unref(m->rd_private_bus); + + if ((m->rd_private_bus = c)) + dbus_connection_ref(c); +} diff --git a/src/modules/reserve-monitor.h b/src/modules/reserve-monitor.h index 85a7ebb..3823e99 100644 --- a/src/modules/reserve-monitor.h +++ b/src/modules/reserve-monitor.h @@ -64,6 +64,13 @@ void rm_set_userdata(rm_monitor *m, void *userdata); * userdata was set. */ void* rm_get_userdata(rm_monitor *m); +/* Registration of the D-Bus connection used by the corresponding rd_device + * object. If you create a new DBusConnection for each rd_device (as you + * should do, in order to avoid problems with leaked NameLost signals), use + * this function to let rm_monitor know about it, so that it can track the + * busy status accurately. */ +void rm_set_rd_private_bus(rm_monitor *m, DBusConnection *c); + #ifdef __cplusplus } #endif -- 1.7.11.7