[maemo-commits] [maemo-commits] r14640 - in projects/haf/trunk/dbus/debian: . patches

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Fri Oct 26 16:23:26 EEST 2007
Author: kihamala
Date: 2007-10-26 16:23:24 +0300 (Fri, 26 Oct 2007)
New Revision: 14640

Added:
   projects/haf/trunk/dbus/debian/patches/35-unref-no-guid-connections.patch
Modified:
   projects/haf/trunk/dbus/debian/changelog
Log:
unref guidless connections, first try


Modified: projects/haf/trunk/dbus/debian/changelog
===================================================================
--- projects/haf/trunk/dbus/debian/changelog	2007-10-26 12:56:38 UTC (rev 14639)
+++ projects/haf/trunk/dbus/debian/changelog	2007-10-26 13:23:24 UTC (rev 14640)
@@ -3,6 +3,7 @@
   * Added dbus-dbg package. Fixes: NB#70750
   * Fixed a possible segfault in dbus_connection_send_with_reply when the
     connection has been disconnected.
+  * Also unreference connections without guid.
 
   Bugs discovered by statical code analysis:
   * Added a missing va_end call to dbus_set_error.

Added: projects/haf/trunk/dbus/debian/patches/35-unref-no-guid-connections.patch
===================================================================
--- projects/haf/trunk/dbus/debian/patches/35-unref-no-guid-connections.patch	2007-10-26 12:56:38 UTC (rev 14639)
+++ projects/haf/trunk/dbus/debian/patches/35-unref-no-guid-connections.patch	2007-10-26 13:23:24 UTC (rev 14640)
@@ -0,0 +1,100 @@
+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


More information about the maemo-commits mailing list