Only reenter the main loop if AT_SPI_CLIENT is set
authorMike Gorse <mgorse@novell.com>
Sun, 14 Mar 2010 12:49:49 +0000 (08:49 -0400)
committerMike Gorse <mgorse@novell.com>
Sun, 14 Mar 2010 12:49:49 +0000 (08:49 -0400)
If AT_SPI_CLIENT is not set, call dbus_connection_read_write_dispatch instead
of re-entering the main loop.  Fixes a deadlock with threaded gtk
applications (ie, gnome-do) where gdk would lock while sending a signal,
at-spi would re-enter the main loop, and gdk would try to process another
signal an re-acquire the lock, causing deadlock because the lock is not
reentrant.

atk-adaptor/event.c

index 34dcda3..69de709 100644 (file)
@@ -72,7 +72,19 @@ send_and_allow_reentry (DBusConnection * bus, DBusMessage * message)
   dbus_pending_call_set_notify (pending, set_reply, (void *) &closure, NULL);
   closure.loop = g_main_loop_new (NULL, FALSE);
 
-  g_main_loop_run  (closure.loop);
+  if (getenv ("AT_SPI_CLIENT"))
+    {
+      g_main_loop_run  (closure.loop);
+    }
+  else
+    {
+      closure.reply = NULL;
+      while (!closure.reply)
+        {
+          if (!dbus_connection_read_write_dispatch (spi_global_app_data->bus, 1000))
+            return NULL;
+        }
+    }
   
   g_main_loop_unref (closure.loop);
   return closure.reply;