From d8646f55f3b0978496bbdf1276d07b25d10b1842 Mon Sep 17 00:00:00 2001
From: Peter Wang <novalazy@gmail.com>
Date: Wed, 24 Nov 2010 17:12:56 +1100
Subject: [PATCH] Potential fix for GTK deadlock.

---
 addons/native_dialog/gtk_dialog.c |   13 ++++++++++++-
 1 files changed, 12 insertions(+), 1 deletions(-)

diff --git a/addons/native_dialog/gtk_dialog.c b/addons/native_dialog/gtk_dialog.c
index 5a0e495..e191518 100644
--- a/addons/native_dialog/gtk_dialog.c
+++ b/addons/native_dialog/gtk_dialog.c
@@ -47,7 +47,11 @@ static GThread *gtk_thread = NULL;
 
 static void *gtk_thread_func(void *data)
 {
+   volatile int *really_started = (volatile int *)data;
+
+   ALLEGRO_DEBUG("Calling gdk_threads_enter.\n");
    gdk_threads_enter();
+   (*really_started) = 1;
    ALLEGRO_DEBUG("Entering gtk_main.\n");
    gtk_main();
    ALLEGRO_DEBUG("Leaving gtk_main.\n");
@@ -59,6 +63,7 @@ static bool gtk_start_and_lock(ALLEGRO_NATIVE_DIALOG *fd)
 {
    int argc = 0;
    char **argv = NULL;
+   volatile int really_started;
 
    if (!g_thread_supported()) {
       ALLEGRO_DEBUG("Calling g_thread_init.\n");
@@ -85,7 +90,13 @@ static bool gtk_start_and_lock(ALLEGRO_NATIVE_DIALOG *fd)
       }
 
       gtk_cond = g_cond_new();
-      gtk_thread = g_thread_create(gtk_thread_func, NULL, TRUE, NULL);
+      really_started = 0;
+      gtk_thread = g_thread_create(gtk_thread_func, (void *)&really_started, TRUE, NULL);
+      ALLEGRO_DEBUG("GTK thread created.\n");
+
+      while (!really_started)
+         al_rest(0.01);
+
       ALLEGRO_INFO("GTK started.\n");
    }
 
-- 
1.7.3.2

