diff -pur dbus-1.0.2/dbus/dbus-connection.c dbus-1.0.2.new/dbus/dbus-connection.c --- dbus-1.0.2/dbus/dbus-connection.c 2006-12-11 21:21:08.000000000 +0200 +++ dbus-1.0.2.new/dbus/dbus-connection.c 2007-10-26 16:21:04.047254488 +0300 @@ -1434,6 +1434,27 @@ _dbus_connection_handle_watch (DBusWatch _DBUS_DEFINE_GLOBAL_LOCK (shared_connections); static DBusHashTable *shared_connections = NULL; +static DBusList *no_guid_connections = NULL; + +static void +connection_shutdown_helper (DBusConnection *connection) +{ + DBusMessage *message; + + _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); + + _DBUS_LOCK (shared_connections); +} static void shared_connections_shutdown (void *data) @@ -1446,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); @@ -1454,19 +1474,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); - - _DBUS_LOCK (shared_connections); + connection_shutdown_helper (connection); /* The connection should now be dead and not in our hash ... */ _dbus_assert (_dbus_hash_table_get_n_entries (shared_connections) < n_entries); @@ -1476,6 +1484,19 @@ shared_connections_shutdown (void *data) _dbus_hash_table_unref (shared_connections); shared_connections = NULL; + + if (no_guid_connections != NULL) + { + DBusConnection *connection; + connection = _dbus_list_pop_first (&no_guid_connections); + while (connection != NULL) + { + connection_shutdown_helper (connection); + connection = _dbus_list_pop_first (&no_guid_connections); + } + } + + no_guid_connections = NULL; _DBUS_UNLOCK (shared_connections); } @@ -1585,7 +1606,18 @@ connection_record_shared_unlocked (DBusC _dbus_connection_ref_unlocked (connection); if (guid == NULL) - return TRUE; /* don't store in the hash */ + { + _DBUS_LOCK (shared_connections); + + if (!_dbus_list_prepend (&no_guid_connections, 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