diff options
Diffstat (limited to 'bus/test.c')
-rw-r--r-- | bus/test.c | 61 |
1 files changed, 52 insertions, 9 deletions
@@ -112,6 +112,49 @@ client_disconnect_handler (DBusMessageHandler *handler, } static int handler_slot = -1; +static int handler_slot_refcount = 0; + +static dbus_bool_t +handler_slot_ref (void) +{ + if (handler_slot < 0) + { + handler_slot = dbus_connection_allocate_data_slot (); + + if (handler_slot < 0) + return FALSE; + + _dbus_assert (handler_slot_refcount == 0); + } + + handler_slot_refcount += 1; + + return TRUE; + +} + +static void +handler_slot_unref (void) +{ + _dbus_assert (handler_slot_refcount > 0); + + handler_slot_refcount -= 1; + + if (handler_slot_refcount == 0) + { + dbus_connection_free_data_slot (handler_slot); + handler_slot = -1; + } +} + +static void +free_handler (void *data) +{ + DBusMessageHandler *handler = data; + + dbus_message_handler_unref (handler); + handler_slot_unref (); +} dbus_bool_t bus_setup_debug_client (DBusConnection *connection) @@ -119,11 +162,6 @@ bus_setup_debug_client (DBusConnection *connection) DBusMessageHandler *disconnect_handler; const char *to_handle[] = { DBUS_MESSAGE_LOCAL_DISCONNECT }; dbus_bool_t retval; - - if (handler_slot < 0) - handler_slot = dbus_connection_allocate_data_slot (); - if (handler_slot < 0) - return FALSE; disconnect_handler = dbus_message_handler_new (client_disconnect_handler, NULL, NULL); @@ -160,12 +198,17 @@ bus_setup_debug_client (DBusConnection *connection) if (!_dbus_list_append (&clients, connection)) goto out; - /* Set up handler to be destroyed */ + if (!handler_slot_ref ()) + goto out; + + /* Set up handler to be destroyed */ if (!dbus_connection_set_data (connection, handler_slot, disconnect_handler, - (DBusFreeFunction) - dbus_message_handler_unref)) - goto out; + free_handler)) + { + handler_slot_unref (); + goto out; + } retval = TRUE; |