From 44cdf059c89a18b56a18caf3bb5e6e60b35b16bb Mon Sep 17 00:00:00 2001 From: "John (J5) Palmieri" Date: Tue, 26 Feb 2008 10:35:56 -0500 Subject: correctly unref connections without guids during shutdown MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * dbus/dbus-connection.c (close_connection_on_shutdown): new method split out from shared_connections_shutdown (shared_connections_shutdown): shutdown all shared connections without guids (_dbus_connection_ref_unlocked): handle OOM when prepending no guid connections to the shared_connections_no_guid list * Patch by Kimmo Hämäläinen --- ChangeLog | 11 ++++++++++ dbus/dbus-connection.c | 58 +++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 56 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index a744539a..d78dd1d6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2008-02-26 John (J5) Palmieri + + * correctly unref connections without guids during shutdown + * dbus/dbus-connection.c (close_connection_on_shutdown): new method + split out from shared_connections_shutdown + (shared_connections_shutdown): shutdown all shared connections + without guids + (_dbus_connection_ref_unlocked): handle OOM when prepending no guid + connections to the shared_connections_no_guid list + * Patch by Kimmo Hämäläinen + 2007-07-18 Havoc Pennington * dbus/dbus-message.c (dbus_message_get_cached) diff --git a/dbus/dbus-connection.c b/dbus/dbus-connection.c index 1fef2b6c..02e7489d 100644 --- a/dbus/dbus-connection.c +++ b/dbus/dbus-connection.c @@ -1438,6 +1438,23 @@ _dbus_connection_handle_watch (DBusWatch *watch, _DBUS_DEFINE_GLOBAL_LOCK (shared_connections); static DBusHashTable *shared_connections = NULL; +static DBusList *shared_connections_no_guid = NULL; + +static void +close_connection_on_shutdown (DBusConnection *connection) +{ + DBusMessage *message; + + dbus_connection_ref (connection); + _dbus_connection_close_possibly_shared (connection); + + /* Churn through to the Disconnected message */ + while ((message = dbus_connection_pop_message (connection))) + { + dbus_message_unref (message); + } + dbus_connection_unref (connection); +} static void shared_connections_shutdown (void *data) @@ -1450,7 +1467,6 @@ shared_connections_shutdown (void *data) while ((n_entries = _dbus_hash_table_get_n_entries (shared_connections)) > 0) { DBusConnection *connection; - DBusMessage *message; DBusHashIter iter; _dbus_hash_iter_init (shared_connections, &iter); @@ -1459,17 +1475,7 @@ shared_connections_shutdown (void *data) connection = _dbus_hash_iter_get_value (&iter); _DBUS_UNLOCK (shared_connections); - - dbus_connection_ref (connection); - _dbus_connection_close_possibly_shared (connection); - - /* Churn through to the Disconnected message */ - while ((message = dbus_connection_pop_message (connection))) - { - dbus_message_unref (message); - } - dbus_connection_unref (connection); - + close_connection_on_shutdown (connection); _DBUS_LOCK (shared_connections); /* The connection should now be dead and not in our hash ... */ @@ -1480,6 +1486,21 @@ shared_connections_shutdown (void *data) _dbus_hash_table_unref (shared_connections); shared_connections = NULL; + + if (shared_connections_no_guid != NULL) + { + DBusConnection *connection; + connection = _dbus_list_pop_first (&shared_connections_no_guid); + while (connection != NULL) + { + _DBUS_UNLOCK (shared_connections); + close_connection_on_shutdown (connection); + _DBUS_LOCK (shared_connections); + connection = _dbus_list_pop_first (&shared_connections_no_guid); + } + } + + shared_connections_no_guid = NULL; _DBUS_UNLOCK (shared_connections); } @@ -1589,7 +1610,18 @@ connection_record_shared_unlocked (DBusConnection *connection, _dbus_connection_ref_unlocked (connection); if (guid == NULL) - return TRUE; /* don't store in the hash */ + { + _DBUS_LOCK (shared_connections); + + if (!_dbus_list_prepend (&shared_connections_no_guid, connection)) + { + _DBUS_UNLOCK (shared_connections); + return FALSE; + } + + _DBUS_UNLOCK (shared_connections); + return TRUE; /* don't store in the hash */ + } /* A separate copy of the key is required in the hash table, because * we don't have a lock on the connection when we are doing a hash -- cgit v1.2.1