2005-02-10 Havoc Pennington <hp@redhat.com>
authorHavoc Pennington <hp@redhat.com>
Thu, 10 Feb 2005 23:47:55 +0000 (23:47 +0000)
committerHavoc Pennington <hp@redhat.com>
Thu, 10 Feb 2005 23:47:55 +0000 (23:47 +0000)
* 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

ChangeLog
dbus/dbus-connection-internal.h
dbus/dbus-connection.c
dbus/dbus-object-tree.c
glib/dbus-gthread.c

index 993294a..eff98ed 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2005-02-10  Havoc Pennington  <hp@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
+
+2005-02-10  Havoc Pennington  <hp@redhat.com>
+
        * dbus/dbus-message-util.c (verify_test_message): tests for string
        array
 
index 6800fef..21dc415 100644 (file)
@@ -89,7 +89,7 @@ DBusMessage*      _dbus_connection_block_for_reply             (DBusConnection
                                                                 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 9e60aa2..dfc5d44 100644 (file)
@@ -1540,11 +1540,12 @@ dbus_connection_free_preallocated_send (DBusConnection       *connection,
   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 @@ _dbus_connection_send_preallocated_and_unlock (DBusConnection       *connection,
 {
   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 @@ dbus_connection_send_preallocated (DBusConnection       *connection,
                                                 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 @@ _dbus_connection_send_unlocked (DBusConnection *connection,
   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 @@ dbus_connection_send_with_reply (DBusConnection     *connection,
                                                      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 @@ dbus_connection_dispatch (DBusConnection *connection)
           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 da8d8c2..ae28cc1 100644 (file)
@@ -607,9 +607,9 @@ _dbus_object_tree_list_registered_unlocked (DBusObjectTree *tree,
 }
 
 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 @@ handle_default_introspect_unlocked (DBusObjectTree          *tree,
   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 @@ handle_default_introspect_unlocked (DBusObjectTree          *tree,
   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 @@ handle_default_introspect_unlocked (DBusObjectTree          *tree,
   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 @@ _dbus_object_tree_dispatch_and_unlock (DBusObjectTree          *tree,
     {
       /* 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)
     {
index f7b6faf..1b925cd 100644 (file)
@@ -21,6 +21,8 @@
  *
  */
 
+/* #define G_DEBUG_LOCKS 1 */
+
 #include <glib.h>
 #include <dbus/dbus.h>
 #include <dbus/dbus-glib.h>