From: Mike Gorse Date: Sun, 14 Mar 2010 12:49:49 +0000 (-0400) Subject: Only reenter the main loop if AT_SPI_CLIENT is set X-Git-Tag: AT_SPI2_ATK_2_12_0~410 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git;a=commitdiff_plain;h=34cdfbd948620d091d55b15f92dbfc462c19efd8 Only reenter the main loop if AT_SPI_CLIENT is set 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. --- diff --git a/atk-adaptor/event.c b/atk-adaptor/event.c index 34dcda3..69de709 100644 --- a/atk-adaptor/event.c +++ b/atk-adaptor/event.c @@ -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;