Jean-Yves Lefort wrote: >Hi all, > >Please consider the attached C source. > >It runs fine on FreeBSD, but freezes on Linux. gtk_dialog_run() calls >a recursive main loop, but I don't know how to interpret this fact to >solve my problem. The workaround I use actually is to simply remove >the gdk_threads_enter()/gdk_threads_leave() pair wrapping the main >loop, as the program runs fine without them. > >Why should I wrap the main loop with that pair? >Is the attached program not correct? Did I mess up somewhere? > Hello, This is the classical deadlock. The problem is that gtk_dialog_run has GDK_THREADS_LEAVE - GDK_THREADS_ENTER pair, not GDK_THREADS_ENTER - GDK_THREADS_LEAVE. When you call gtk_dialog_run inside the main loop - all is OK, but you will get locked in your situation, cause: 1. gtk_dialog_run calls GDK_THREADS_LEAVE -> g_mutex_unlock(), runs mail loop. 2. After main loop finished gtk_run_dialog calls GDK_THREADS_ENTER -> g_mutex_lock() and owns gdk_threads_mutex mutex. 3. You code calls gdk_threads_enter and get the deadlock cause mutex is owned (under Linux pthread uses 'fast' mutexes, which causes to block even they were locked by the same thread).
If your application is not mt or you dont draw anything in another threads you can skip gdk_main() guarding. <skipped> > g_signal_connect(G_OBJECT(window), "delete_event", > G_CALLBACK(delete_event_handler), NULL); > You can save some lines of code here, if you put: g_signal_connect(..., (GCallback)gtk_main_quit, ...) ;) <skipped> > dialog = gtk_message_dialog_new(GTK_WINDOW(window), > GTK_DIALOG_DESTROY_WITH_PARENT, > GTK_MESSAGE_WARNING, > GTK_BUTTONS_OK, > "Test dialog"); > /* You need to put these lines to get it work under Linux: */ gdk_threads_enter(); /* you owns the mutex, this line can be ignored */ > gtk_dialog_run(GTK_DIALOG(dialog)); > gdk_threads_leave(); /* you freeing the mutex, this line is what you need */ The behaviour under FreeBSD and Linux depends on threading library are you using. Olexiy _______________________________________________ gtk-list mailing list [EMAIL PROTECTED] http://mail.gnome.org/mailman/listinfo/gtk-list
