diff options
author | Havoc Pennington <hp@redhat.com> | 2003-03-17 05:39:10 +0000 |
---|---|---|
committer | Havoc Pennington <hp@redhat.com> | 2003-03-17 05:39:10 +0000 |
commit | f7c24715b5489b28b47499eb252b941b735fa1bc (patch) | |
tree | 53e62e764a0c5e0ba25791b6f6ae3dbbf1fc4f54 /bus/connection.c | |
parent | 15f02e1071ab14a7bc937cb61a4439a69c14f1a5 (diff) | |
download | dbus-f7c24715b5489b28b47499eb252b941b735fa1bc.tar.gz |
2003-03-17 Havoc Pennington <hp@pobox.com>
All tests pass, no memleaks, no valgrind complaints.
* bus/test.c: refcount handler_slot
* bus/connection.c (bus_connections_new): refcount
connection_data_slot
* dbus/dbus-auth-script.c (_dbus_auth_script_run): delete unused
bytes so that auth scripts pass.
* bus/dispatch.c: init message_handler_slot so it gets allocated
properly
* bus/dispatch.c (message_handler_slot_ref): fix memleak
* dbus/dbus-server-debug-pipe.c (_dbus_server_debug_pipe_new):
dealloc server_pipe_hash when no longer used for benefit of
leak checking
* dbus/dbus-auth.c (process_command): memleak fix
* bus/dispatch.c (check_hello_message): memleak fix
Diffstat (limited to 'bus/connection.c')
-rw-r--r-- | bus/connection.c | 60 |
1 files changed, 51 insertions, 9 deletions
diff --git a/bus/connection.c b/bus/connection.c index a8616683..1b59819f 100644 --- a/bus/connection.c +++ b/bus/connection.c @@ -37,6 +37,7 @@ struct BusConnections }; static int connection_data_slot = -1; +static int connection_data_slot_refcount = 0; typedef struct { @@ -51,6 +52,39 @@ typedef struct #define BUS_CONNECTION_DATA(connection) (dbus_connection_get_data ((connection), connection_data_slot)) +static dbus_bool_t +connection_data_slot_ref (void) +{ + if (connection_data_slot < 0) + { + connection_data_slot = dbus_connection_allocate_data_slot (); + + if (connection_data_slot < 0) + return FALSE; + + _dbus_assert (connection_data_slot_refcount == 0); + } + + connection_data_slot_refcount += 1; + + return TRUE; + +} + +static void +connection_data_slot_unref (void) +{ + _dbus_assert (connection_data_slot_refcount > 0); + + connection_data_slot_refcount -= 1; + + if (connection_data_slot_refcount == 0) + { + dbus_connection_free_data_slot (connection_data_slot); + connection_data_slot = -1; + } +} + void bus_connection_disconnected (DBusConnection *connection) { @@ -209,6 +243,7 @@ free_connection_data (void *data) if (d->oom_preallocated) dbus_connection_free_preallocated_send (d->connection, d->oom_preallocated); + if (d->oom_message) dbus_message_unref (d->oom_message); @@ -222,17 +257,15 @@ bus_connections_new (BusContext *context) { BusConnections *connections; - if (connection_data_slot < 0) - { - connection_data_slot = dbus_connection_allocate_data_slot (); - - if (connection_data_slot < 0) - return NULL; - } + if (!connection_data_slot_ref ()) + return NULL; connections = dbus_new0 (BusConnections, 1); if (connections == NULL) - return NULL; + { + connection_data_slot_unref (); + return NULL; + } connections->refcount = 1; connections->context = context; @@ -268,7 +301,9 @@ bus_connections_unref (BusConnections *connections) _dbus_list_clear (&connections->list); - dbus_free (connections); + dbus_free (connections); + + connection_data_slot_unref (); } } @@ -286,6 +321,8 @@ bus_connections_setup_connection (BusConnections *connections, d->connections = connections; d->connection = connection; + + _dbus_assert (connection_data_slot >= 0); if (!dbus_connection_set_data (connection, connection_data_slot, @@ -329,6 +366,11 @@ bus_connections_setup_connection (BusConnections *connections, out: if (!retval) { + if (!dbus_connection_set_data (connection, + connection_data_slot, + NULL, NULL)) + _dbus_assert_not_reached ("failed to set connection data to null"); + if (!dbus_connection_set_watch_functions (connection, NULL, NULL, NULL, connection, |