dbus/dbus dbus-connection-internal.h, 1.21, 1.22 dbus-connection.c, 1.92, 1.93 dbus-object-tree.c, 1.12, 1.13

Havoc Pennington hp at freedesktop.org
Thu Feb 10 15:47:57 PST 2005


Update of /cvs/dbus/dbus/dbus
In directory gabe:/tmp/cvs-serv23096/dbus

Modified Files:
	dbus-connection-internal.h dbus-connection.c 
	dbus-object-tree.c 
Log Message:
2005-02-10  Havoc Pennington  <hp at redhat.com>

	* dbus/dbus-object-tree.c (handle_default_introspect_and_unlock):
	change to be _and_unlock instead of _unlocked

	* dbus/dbus-connection.c
	(_dbus_connection_send_preallocated_unlocked_no_update): rename to
	have no_update so we can find this bug quickly in future



Index: dbus-connection-internal.h
===================================================================
RCS file: /cvs/dbus/dbus/dbus/dbus-connection-internal.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- dbus-connection-internal.h	30 Jan 2005 20:06:52 -0000	1.21
+++ dbus-connection-internal.h	10 Feb 2005 23:47:54 -0000	1.22
@@ -89,7 +89,7 @@
                                                                 int                 timeout_milliseconds);
 void              _dbus_pending_call_complete_and_unlock       (DBusPendingCall    *pending,
                                                                 DBusMessage        *message);
-dbus_bool_t       _dbus_connection_send_unlocked               (DBusConnection     *connection,
+dbus_bool_t       _dbus_connection_send_and_unlock             (DBusConnection     *connection,
                                                                 DBusMessage        *message,
                                                                 dbus_uint32_t      *client_serial);
 

Index: dbus-connection.c
===================================================================
RCS file: /cvs/dbus/dbus/dbus/dbus-connection.c,v
retrieving revision 1.92
retrieving revision 1.93
diff -u -d -r1.92 -r1.93
--- dbus-connection.c	10 Feb 2005 23:01:27 -0000	1.92
+++ dbus-connection.c	10 Feb 2005 23:47:54 -0000	1.93
@@ -1540,11 +1540,12 @@
   dbus_free (preallocated);
 }
 
+/* Called with lock held, does not update dispatch status */
 static void
-_dbus_connection_send_preallocated_unlocked (DBusConnection       *connection,
-                                             DBusPreallocatedSend *preallocated,
-                                             DBusMessage          *message,
-                                             dbus_uint32_t        *client_serial)
+_dbus_connection_send_preallocated_unlocked_no_update (DBusConnection       *connection,
+                                                       DBusPreallocatedSend *preallocated,
+                                                       DBusMessage          *message,
+                                                       dbus_uint32_t        *client_serial)
 {
   dbus_uint32_t serial;
   const char *sig;
@@ -1620,9 +1621,9 @@
 {
   DBusDispatchStatus status;
 
-  _dbus_connection_send_preallocated_unlocked (connection,
-                                               preallocated,
-                                               message, client_serial);
+  _dbus_connection_send_preallocated_unlocked_no_update (connection,
+                                                         preallocated,
+                                                         message, client_serial);
 
   status = _dbus_connection_get_dispatch_status_unlocked (connection);
 
@@ -1665,10 +1666,10 @@
 						 message, client_serial);
 }
 
-dbus_bool_t
-_dbus_connection_send_unlocked (DBusConnection *connection,
-                                DBusMessage    *message,
-                                dbus_uint32_t  *client_serial)
+static dbus_bool_t
+_dbus_connection_send_unlocked_no_update (DBusConnection *connection,
+                                          DBusMessage    *message,
+                                          dbus_uint32_t  *client_serial)
 {
   DBusPreallocatedSend *preallocated;
 
@@ -1679,15 +1680,14 @@
   if (preallocated == NULL)
     return FALSE;
 
-
-  _dbus_connection_send_preallocated_unlocked (connection,
-                                               preallocated,
-                                               message,
-                                               client_serial);
+  _dbus_connection_send_preallocated_unlocked_no_update (connection,
+                                                         preallocated,
+                                                         message,
+                                                         client_serial);
   return TRUE;
 }
 
-static dbus_bool_t
+dbus_bool_t
 _dbus_connection_send_and_unlock (DBusConnection *connection,
 				  DBusMessage    *message,
 				  dbus_uint32_t  *client_serial)
@@ -1867,7 +1867,7 @@
 						      pending))
     goto error;
   
-  if (!_dbus_connection_send_unlocked (connection, message, NULL))
+  if (!_dbus_connection_send_unlocked_no_update (connection, message, NULL))
     {
       _dbus_connection_detach_pending_call_and_unlock (connection,
 						       pending);
@@ -2821,8 +2821,8 @@
           goto out;
         }
 
-      _dbus_connection_send_preallocated_unlocked (connection, preallocated,
-                                                   reply, NULL);
+      _dbus_connection_send_preallocated_unlocked_no_update (connection, preallocated,
+                                                             reply, NULL);
 
       dbus_message_unref (reply);
       

Index: dbus-object-tree.c
===================================================================
RCS file: /cvs/dbus/dbus/dbus/dbus-object-tree.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- dbus-object-tree.c	30 Jan 2005 07:44:08 -0000	1.12
+++ dbus-object-tree.c	10 Feb 2005 23:47:55 -0000	1.13
@@ -607,9 +607,9 @@
 }
 
 static DBusHandlerResult
-handle_default_introspect_unlocked (DBusObjectTree          *tree,
-                                    DBusMessage             *message,
-                                    const char             **path)
+handle_default_introspect_and_unlock (DBusObjectTree          *tree,
+                                      DBusMessage             *message,
+                                      const char             **path)
 {
   DBusString xml;
   DBusHandlerResult result;
@@ -618,8 +618,11 @@
   DBusMessage *reply;
   DBusMessageIter iter;
   const char *v_STRING;
+  dbus_bool_t already_unlocked;
 
   /* We have the connection lock here */
+
+  already_unlocked = FALSE;
   
   _dbus_verbose (" considering default Introspect() handler...\n");
 
@@ -628,12 +631,26 @@
   if (!dbus_message_is_method_call (message,
                                     DBUS_INTERFACE_ORG_FREEDESKTOP_INTROSPECTABLE,
                                     "Introspect"))
-    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    {
+#ifdef DBUS_BUILD_TESTS
+      if (tree->connection)
+#endif
+        _dbus_connection_unlock (tree->connection);
+      
+      return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    }
 
   _dbus_verbose (" using default Introspect() handler!\n");
   
   if (!_dbus_string_init (&xml))
-    return DBUS_HANDLER_RESULT_NEED_MEMORY;
+    {
+#ifdef DBUS_BUILD_TESTS
+      if (tree->connection)
+#endif
+        _dbus_connection_unlock (tree->connection);
+
+      return DBUS_HANDLER_RESULT_NEED_MEMORY;
+    }
 
   result = DBUS_HANDLER_RESULT_NEED_MEMORY;
 
@@ -673,13 +690,21 @@
   if (tree->connection)
 #endif
     {
-      if (!_dbus_connection_send_unlocked (tree->connection, reply, NULL))
+      if (!_dbus_connection_send_and_unlock (tree->connection, reply, NULL))
         goto out;
     }
   
   result = DBUS_HANDLER_RESULT_HANDLED;
   
  out:
+#ifdef DBUS_BUILD_TESTS
+  if (tree->connection)
+#endif
+    {
+      if (!already_unlocked)
+        _dbus_connection_unlock (tree->connection);
+    }
+  
   _dbus_string_free (&xml);
   dbus_free_string_array (children);
   if (reply)
@@ -826,14 +851,16 @@
     {
       /* This hardcoded default handler does a minimal Introspect()
        */
-      result = handle_default_introspect_unlocked (tree, message,
-                                                   (const char**) path);
+      result = handle_default_introspect_and_unlock (tree, message,
+                                                     (const char**) path);
     }
-
+  else
+    {
 #ifdef DBUS_BUILD_TESTS
-  if (tree->connection)
+      if (tree->connection)
 #endif
-    _dbus_connection_unlock (tree->connection);
+        _dbus_connection_unlock (tree->connection);
+    }
   
   while (list != NULL)
     {



More information about the dbus-commit mailing list