menuitems and threads bug?
- From: Matthew Allan Ahrens <mahrens cs brown edu>
- To: gtk-devel-list redhat com
- Subject: menuitems and threads bug?
- Date: Wed, 10 Mar 1999 22:43:13 -0500 (EST)
Let me preface this by saying that I have just started using GTK recently,
and I may be doing something completely stupid here (but I don't think I
am). If that is the case, flame away :-)
I am trying to write a threaded program, using GTK 1.2.0 on Solaris 2.6,
using menus. The problem that I observe is that clicking on a menu causes
the program to hang. For instance, I simply added a call to
g_thread_init(NULL); to the example menu program in the tutorial, and
observed this problem.
Stack Trace: [argument addresses removed for readability; sorry i dont
have a debug libgtk handy]
[1] ___lwp_mutex_lock()
[2] _mutex_lwp_lock()
[3] _cmutex_lock()
[4] pthread_mutex_lock()
[5] gtk_menu_item_select_timeout(), line 633 in "gtkmenuitem.c"
[6] gtk_real_menu_item_select(), line 444 in "gtkmenuitem.c"
[7] gtk_signal_real_emit()
[8] gtk_signal_emit()
[9] gtk_menu_shell_button_press()
[10] gtk_marshal_BOOL__POINTER()
[11] gtk_signal_real_emit()
[12] gtk_signal_emit()
[13] gtk_widget_event()
[14] gtk_propagate_event()
[15] gtk_main_do_event()
[16] gdk_event_dispatch()
[17] g_main_dispatch()
[18] g_main_iterate()
[19] g_main_run()
[20] gtk_main()
=>[21] main(argc = 1, argv = 0xeffff7cc), line 111 in "test.c"
what seems to be happening is that gtk_real_menu_item_select is calling
gtk_menu_item_select_timeout directly. However, gtk_real_menu_item_select
is running from the main loop, with the gdk mutex locked, and the timeout
function expects to be called without the mutex locked, and hence it locks
it.
As I said I have just begun using GTK, so please point out any flaws in my
logic or understanding of how things work.
I patched gtkmenuitem.c with the following patch, which solved my problem:
*** gtkmenuitem.c Wed Feb 24 05:15:10 1999
--- /ltmp/syslaba/mahrens/gtk+-1.2.0/gtk/gtkmenuitem.c Wed Mar 10 17:39:46 1999
***************
*** 553,556 ****
menu_item);
! else
gtk_menu_item_select_timeout (menu_item);
if(event) gdk_event_free(event);
--- 553,559 ----
menu_item);
! else {
! GDK_THREADS_LEAVE ();
gtk_menu_item_select_timeout (menu_item);
+ GDK_THREADS_ENTER ();
+ }
if(event) gdk_event_free(event);
=======PATCH END=========
Thanks,
--matt
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]