From e7401aab8b6a2442f392e1e3cb361064af348d9e Mon Sep 17 00:00:00 2001 From: liyuan Date: Fri, 19 Jan 2007 02:29:15 +0000 Subject: [PATCH] 2007-01-19 Li Yuan * atk-bridge/bridge.c: (atk_bridge_init), (spi_atk_bridge_register_application), (deregister_application), (spi_atk_bridge_focus_tracker), (spi_atk_emit_eventv): Bug #329454. Use atk_misc_threads_enter/atk_misc_threads_leave to prevent deadlock. git-svn-id: http://svn.gnome.org/svn/at-spi/trunk@878 e2bd861d-eb25-0410-b326-f6ed22b6b98c --- ChangeLog | 9 +++++++++ atk-bridge/bridge.c | 17 ++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 371d154..6313a88 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2007-01-19 Li Yuan + + * atk-bridge/bridge.c: + (atk_bridge_init), (spi_atk_bridge_register_application), + (deregister_application), (spi_atk_bridge_focus_tracker), + (spi_atk_emit_eventv): + Bug #329454. Use atk_misc_threads_enter/atk_misc_threads_leave + to prevent deadlock. + 2007-01-08 Li Yuan * configure.in, NEWS: Uprev/release 1.7.15 for gnome 2.17.5. diff --git a/atk-bridge/bridge.c b/atk-bridge/bridge.c index 901f5b3..f387e5a 100644 --- a/atk-bridge/bridge.c +++ b/atk-bridge/bridge.c @@ -55,6 +55,7 @@ static gboolean registry_died = FALSE; static gboolean atk_listeners_registered = FALSE; static gint toplevels = 0; static gboolean exiting = FALSE; +static AtkMisc *misc = NULL; static guint atk_signal_text_changed; static guint atk_signal_children_changed; @@ -184,6 +185,8 @@ atk_bridge_init (gint *argc, gchar **argv[]) atk_bridge_initialized = TRUE; atk_bridge_pid = getpid (); + misc = atk_misc_get_instance(); + if (g_getenv ("ATK_BRIDGE_REDIRECT_LOG")) { fname = g_strconcat ("/tmp/", g_get_prgname (), ".at-spi-log", NULL); @@ -302,9 +305,11 @@ spi_atk_bridge_toplevel_removed (AtkObject *object, static void spi_atk_bridge_register_application (Accessibility_Registry registry) { + atk_misc_threads_leave (misc); Accessibility_Registry_registerApplication (spi_atk_bridge_get_registry (), BONOBO_OBJREF (this_app), &ev); + atk_misc_threads_enter (misc); if (ev._major != CORBA_NO_EXCEPTION) CORBA_exception_free (&ev); } @@ -554,8 +559,10 @@ spi_atk_register_event_listeners (void) static void deregister_application (BonoboObject *app) { - Accessibility_Registry registry = spi_atk_bridge_get_registry (); + Accessibility_Registry registry = spi_atk_bridge_get_registry (); + atk_misc_threads_leave (misc); Accessibility_Registry_deregisterApplication (registry, BONOBO_OBJREF (app), &ev); + atk_misc_threads_enter (misc); device_event_controller = bonobo_object_release_unref (device_event_controller, &ev); registry = bonobo_object_release_unref (registry, &ev); @@ -672,9 +679,12 @@ spi_atk_bridge_focus_tracker (AtkObject *object) spi_atk_bridge_init_nil (&e.any_data, object); if (BONOBO_EX (&ev)) registry_died = TRUE; - else + else { + atk_misc_threads_leave (misc); Accessibility_Registry_notifyEvent (spi_atk_bridge_get_registry (), &e, &ev); + atk_misc_threads_enter (misc); + } if (BONOBO_EX (&ev)) registry_died = TRUE; @@ -742,9 +752,10 @@ spi_atk_emit_eventv (const GObject *gobject, registry = spi_atk_bridge_get_registry (); if (!registry_died) { - + atk_misc_threads_leave (misc); Accessibility_Registry_notifyEvent (registry, &e, &ev); + atk_misc_threads_enter (misc); #ifdef SPI_BRIDGE_DEBUG if (ev._major != CORBA_NO_EXCEPTION) g_message ("error emitting event %s, (%d) %s", -- 2.7.4