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 /dbus/dbus-server-debug-pipe.c | |
parent | 15f02e1071ab14a7bc937cb61a4439a69c14f1a5 (diff) |
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 'dbus/dbus-server-debug-pipe.c')
-rw-r--r-- | dbus/dbus-server-debug-pipe.c | 60 |
1 files changed, 48 insertions, 12 deletions
diff --git a/dbus/dbus-server-debug-pipe.c b/dbus/dbus-server-debug-pipe.c index 46e78ddd..c9a25020 100644 --- a/dbus/dbus-server-debug-pipe.c +++ b/dbus/dbus-server-debug-pipe.c @@ -59,13 +59,48 @@ struct DBusServerDebugPipe dbus_bool_t disconnected; /**< TRUE if disconnect has been called */ }; +/* FIXME not threadsafe (right now the test suite doesn't use threads anyhow ) */ static DBusHashTable *server_pipe_hash; +static int server_pipe_hash_refcount = 0; +static dbus_bool_t +pipe_hash_ref (void) +{ + if (!server_pipe_hash) + { + _dbus_assert (server_pipe_hash_refcount == 0); + + server_pipe_hash = _dbus_hash_table_new (DBUS_HASH_STRING, NULL, NULL); + + if (!server_pipe_hash) + return FALSE; + } + + server_pipe_hash_refcount = 1; + + return TRUE; +} + +static void +pipe_hash_unref (void) +{ + _dbus_assert (server_pipe_hash != NULL); + _dbus_assert (server_pipe_hash_refcount > 0); + + server_pipe_hash_refcount -= 1; + if (server_pipe_hash_refcount == 0) + { + _dbus_hash_table_unref (server_pipe_hash); + server_pipe_hash = NULL; + } +} static void debug_finalize (DBusServer *server) { DBusServerDebugPipe *debug_server = (DBusServerDebugPipe*) server; + + pipe_hash_unref (); _dbus_server_finalize_base (server); @@ -107,27 +142,23 @@ _dbus_server_debug_pipe_new (const char *server_name, { DBusServerDebugPipe *debug_server; - if (!server_pipe_hash) - { - server_pipe_hash = _dbus_hash_table_new (DBUS_HASH_STRING, NULL, NULL); - - if (!server_pipe_hash) - { - dbus_set_result (result, DBUS_RESULT_NO_MEMORY); - return NULL; - } - } - + if (!pipe_hash_ref ()) + return NULL; + if (_dbus_hash_table_lookup_string (server_pipe_hash, server_name) != NULL) { dbus_set_result (result, DBUS_RESULT_ADDRESS_IN_USE); + pipe_hash_unref (); return NULL; } debug_server = dbus_new0 (DBusServerDebugPipe, 1); if (debug_server == NULL) - return NULL; + { + pipe_hash_unref (); + return NULL; + } debug_server->name = _dbus_strdup (server_name); if (debug_server->name == NULL) @@ -136,6 +167,9 @@ _dbus_server_debug_pipe_new (const char *server_name, dbus_free (debug_server); dbus_set_result (result, DBUS_RESULT_NO_MEMORY); + + pipe_hash_unref (); + return NULL; } if (!_dbus_server_init_base (&debug_server->base, @@ -146,6 +180,7 @@ _dbus_server_debug_pipe_new (const char *server_name, dbus_set_result (result, DBUS_RESULT_NO_MEMORY); + pipe_hash_unref (); return NULL; } @@ -159,6 +194,7 @@ _dbus_server_debug_pipe_new (const char *server_name, dbus_set_result (result, DBUS_RESULT_NO_MEMORY); + pipe_hash_unref (); return NULL; } |