02.02.2009 в 07:20:25 +0400 Stepan Golosunov написал:
> Grepping through the sources I see that sweep is a multithreaded gtk
> program. And after reading
> /usr/share/doc/libgtk2.0-doc/faq/html/x482.html and
> /usr/share/doc/libgtk2.0-doc/gdk/gdk-Threads.html I think sweep is
> using gtk from multiple threads improperly (as it doesn't use
> gdk_threads_init() and gdk_threads_enter()/gdk_threads_leave()).

Sweep crashes with the following stacktrace:

Thread 6 (Thread 0xf320cb90 (LWP 16581)):
#0  0xf7f0a425 in __kernel_vsyscall ()
#1  0xf7455640 in raise () from /lib/i686/cmov/libc.so.6
#2  0xf7457018 in abort () from /lib/i686/cmov/libc.so.6
#3  0xf744e5be in __assert_fail () from /lib/i686/cmov/libc.so.6
#4  0xf737ed7e in _XCBUnlockDisplay (dpy=0x9780060) at ../../src/xcb_lock.c:33
#5  0xf736bd66 in XPutImage (dpy=0x9780060, d=48235964, gc=0x993ff00, 
image=0xf3209b6c, req_xoffset=0, req_yoffset=0, x=0, y=0, req_width=24, 
req_height=24) at ../../src/PutImage.c:1033
#6  0xf72d4c1e in XcursorImageLoadCursor () from /usr/lib/libXcursor.so.1
#7  0xf72d5918 in XcursorImagesLoadCursor () from /usr/lib/libXcursor.so.1
#8  0xf72d8f3a in XcursorTryShapeCursor () from /usr/lib/libXcursor.so.1
#9  0xf7354b0f in XCreateGlyphCursor (dpy=0x9780060, source_font=48234499, 
mask_font=48234499, source_char=152, mask_char=153, foreground=0xf73df62c, 
background=0xf73df638)
    at ../../src/CrGlCur.c:175
#10 0xf7355259 in XCreateFontCursor (dpy=0x9780060, which=152) at 
../../src/Cursor.c:52
#11 0xf7b12872 in IA__gdk_cursor_new_for_display (display=0x9788020, 
cursor_type=GDK_XTERM) at 
/build/buildd/gtk+2.0-2.12.11/gdk/x11/gdkcursor-x11.c:132
#12 0xf7c30520 in gtk_entry_state_changed (widget=0x99463c0, 
previous_state=GTK_STATE_INSENSITIVE) at 
/build/buildd/gtk+2.0-2.12.11/gtk/gtkentry.c:2191
#13 0xf79cdadc in IA__g_cclosure_marshal_VOID__ENUM (closure=0x97ff1f0, 
return_value=0x0, n_param_values=2, param_values=0xf3209f98, 
invocation_hint=0xf3209ecc, marshal_data=0xf7c30430)
    at /tmp/buildd/glib2.0-2.16.6/gobject/gmarshal.c:356
#14 0xf79bf089 in g_type_class_meta_marshal (closure=0x97ff1f0, 
return_value=0x0, n_param_values=2, param_values=0xf3209f98, 
invocation_hint=0xf3209ecc, marshal_data=0x84)
    at /tmp/buildd/glib2.0-2.16.6/gobject/gclosure.c:567
#15 0xf79c090b in IA__g_closure_invoke (closure=0x97ff1f0, return_value=0x0, 
n_param_values=2, param_values=0xf3209f98, invocation_hint=0xf3209ecc)
    at /tmp/buildd/glib2.0-2.16.6/gobject/gclosure.c:490
#16 0xf79d36b6 in signal_emit_unlocked_R (node=0x981ce60, detail=0, 
instance=0x99463c0, emission_return=0x0, instance_and_params=0xf3209f98)
    at /tmp/buildd/glib2.0-2.16.6/gobject/gsignal.c:2370
#17 0xf79d538e in IA__g_signal_emit_valist (instance=0x99463c0, signal_id=19, 
detail=0, var_args=0xf320a1b0 "\023") at 
/tmp/buildd/glib2.0-2.16.6/gobject/gsignal.c:2199
#18 0xf79d57d6 in IA__g_signal_emit (instance=0x99463c0, signal_id=19, 
detail=0) at /tmp/buildd/glib2.0-2.16.6/gobject/gsignal.c:2243
#19 0xf7de2940 in gtk_widget_propagate_state (widget=0x99463c0, 
data=0xf320a258) at /build/buildd/gtk+2.0-2.12.11/gtk/gtkwidget.c:8102
#20 0xf7bcf250 in gtk_box_forall (container=0x99488a8, include_internals=1, 
callback=0xf7de2850 <gtk_widget_propagate_state>, callback_data=0xf320a258)
    at /build/buildd/gtk+2.0-2.12.11/gtk/gtkbox.c:799
#21 0xf7c129e6 in IA__gtk_container_forall (container=0x99488a8, 
callback=0xf7de2850 <gtk_widget_propagate_state>, callback_data=0xf320a258)
    at /build/buildd/gtk+2.0-2.12.11/gtk/gtkcontainer.c:1453
#22 0xf7de29db in gtk_widget_propagate_state (widget=0x99488a8, 
data=0xf320a258) at /build/buildd/gtk+2.0-2.12.11/gtk/gtkwidget.c:8108
#23 0xf7de59ad in IA__gtk_widget_set_sensitive (widget=0x99488a8, 
sensitive=<value optimized out>) at 
/build/buildd/gtk+2.0-2.12.11/gtk/gtkwidget.c:5462
#24 0x0807a6ab in do_record_regions ()
#25 0x0807a71d in do_record_regions_thread ()
#26 0x0808cf67 in op_main ()
#27 0xf799a4c0 in start_thread () from /lib/i686/cmov/libpthread.so.0
#28 0xf750a6de in clone () from /lib/i686/cmov/libc.so.6

Thread 1 (Thread 0xf707c8c0 (LWP 16574)):
#0  0xf7f0a425 in __kernel_vsyscall ()
#1  0xf799e025 in pthread_cond_wait@@GLIBC_2.3.2 () from 
/lib/i686/cmov/libpthread.so.0
#2  0xf715d034 in _xcb_wait_io (c=0x97805a0, cond=0x9781664) at xcb_conn.c:299
#3  0xf715dec5 in xcb_send_request (c=0x97805a0, flags=0, vector=0xff823638, 
req=0xff823650) at xcb_out.c:193
#4  0xf737e936 in _XPutXCBBuffer (dpy=0x9780060) at ../../src/xcb_lock.c:148
#5  0xf737ed00 in _XCBUnlockDisplay (dpy=0x9780060) at ../../src/xcb_lock.c:31
#6  0xf7355916 in XDrawLine (dpy=0x9780060, d=48235962, gc=0x99ce698, x1=70, 
y1=222, x2=70, y2=222) at ../../src/DrLine.c:98
#7  0xf7b1c34f in gdk_x11_draw_segments (drawable=0x99395b0, gc=0x9adc240, 
segs=0xff8237bc, nsegs=1) at 
/build/buildd/gtk+2.0-2.12.11/gdk/x11/gdkdrawable-x11.c:724
#8  0xf7af21c9 in IA__gdk_draw_segments (drawable=0x99395b0, gc=0x9adc240, 
segs=0xff8237bc, nsegs=1) at /build/buildd/gtk+2.0-2.12.11/gdk/gdkdraw.c:827
#9  0xf7af21c9 in IA__gdk_draw_segments (drawable=0x9af7a48, gc=0x9adc240, 
segs=0xff8237bc, nsegs=1) at /build/buildd/gtk+2.0-2.12.11/gdk/gdkdraw.c:827
#10 0xf7b0ca03 in gdk_window_draw_segments (drawable=0x9ad9d80, gc=0x9adc240, 
segs=0xff8237bc, nsegs=1) at /build/buildd/gtk+2.0-2.12.11/gdk/gdkwindow.c:1670
#11 0xf7af2a1c in IA__gdk_draw_line (drawable=0x9ad9d80, gc=0x9adc240, x1=70, 
y1=222, x2=70, y2=222) at /build/buildd/gtk+2.0-2.12.11/gdk/gdkdraw.c:359
#12 0x0807f9f4 in sample_display_draw_data_channel ()
#13 0x0807fe46 in sample_display_draw_data ()
#14 0x08080dba in sample_display_draw ()
#15 0x08080efe in sample_display_expose ()
#16 0xf7cb5726 in _gtk_marshal_BOOLEAN__BOXED (closure=0x9812190, 
return_value=0xff823c50, n_param_values=2, param_values=0xff823d08, 
invocation_hint=0xff823c3c, marshal_data=0x8080edd)
    at /build/buildd/gtk+2.0-2.12.11/gtk/gtkmarshalers.c:84
#17 0xf79bf089 in g_type_class_meta_marshal (closure=0x9812190, 
return_value=0xff823c50, n_param_values=2, param_values=0xff823d08, 
invocation_hint=0xff823c3c, marshal_data=0xc8)
    at /tmp/buildd/glib2.0-2.16.6/gobject/gclosure.c:567
#18 0xf79c090b in IA__g_closure_invoke (closure=0x9812190, 
return_value=0xff823c50, n_param_values=2, param_values=0xff823d08, 
invocation_hint=0xff823c3c)
    at /tmp/buildd/glib2.0-2.16.6/gobject/gclosure.c:490
#19 0xf79d3b05 in signal_emit_unlocked_R (node=0x97fbaa8, detail=0, 
instance=0x99d4478, emission_return=0xff823ec8, instance_and_params=0xff823d08)
    at /tmp/buildd/glib2.0-2.16.6/gobject/gsignal.c:2478
#20 0xf79d5218 in IA__g_signal_emit_valist (instance=0x99d4478, signal_id=40, 
detail=0, var_args=0xff823f20 "8?\202ÿÃ?\202ÿxD\235\tf2Ã÷xD\235\t°Ã\177\t")
    at /tmp/buildd/glib2.0-2.16.6/gobject/gsignal.c:2209
#21 0xf79d57d6 in IA__g_signal_emit (instance=0x99d4478, signal_id=40, 
detail=0) at /tmp/buildd/glib2.0-2.16.6/gobject/gsignal.c:2243
#22 0xf7dde2de in gtk_widget_event_internal (widget=0x99d4478, 
event=0xff823fc0) at /build/buildd/gtk+2.0-2.12.11/gtk/gtkwidget.c:4678
#23 0xf7caf8f8 in IA__gtk_main_do_event (event=0xff823fc0) at 
/build/buildd/gtk+2.0-2.12.11/gtk/gtkmain.c:1514
#24 0xf7b09d7d in gdk_window_process_updates_internal (window=0x9ad9d80) at 
/build/buildd/gtk+2.0-2.12.11/gdk/gdkwindow.c:2378
#25 0xf7b0a38f in IA__gdk_window_process_all_updates () at 
/build/buildd/gtk+2.0-2.12.11/gdk/gdkwindow.c:2444
#26 0xf7c12b7f in gtk_container_idle_sizer (data=0x0) at 
/build/buildd/gtk+2.0-2.12.11/gtk/gtkcontainer.c:1307
#27 0xf7aef78b in gdk_threads_dispatch (data=0x99479b0) at 
/build/buildd/gtk+2.0-2.12.11/gdk/gdk.c:470
#28 0xf75bc271 in g_idle_dispatch (source=0x9aeaf50, callback=0, 
user_data=0x99479b0) at /tmp/buildd/glib2.0-2.16.6/glib/gmain.c:4090
#29 0xf75be1b8 in IA__g_main_context_dispatch (context=0x978df08) at 
/tmp/buildd/glib2.0-2.16.6/glib/gmain.c:2012
#30 0xf75c1853 in g_main_context_iterate (context=0x978df08, block=1, 
dispatch=1, self=0x978d960) at /tmp/buildd/glib2.0-2.16.6/glib/gmain.c:2645
#31 0xf75c1d72 in IA__g_main_loop_run (loop=0x97fc0a0) at 
/tmp/buildd/glib2.0-2.16.6/glib/gmain.c:2853
#32 0xf7cafba9 in IA__gtk_main () at 
/build/buildd/gtk+2.0-2.12.11/gtk/gtkmain.c:1163
#33 0x08056ac7 in main ()
#0  0xf7f0a425 in __kernel_vsyscall ()


According to XInitThreads(3) call to XInitThreads is mandatory when
accessing Xlib from multiple threads concurrently. With the following
patch I'm unable to reproduce crash:

--- sweep-0.9.3.orig/src/main.c 2008-04-11 17:59:54.000000000 +0500
+++ sweep-0.9.3/src/main.c      2009-02-02 22:45:47.682879443 +0400
@@ -138,6 +138,8 @@
 #endif
 #endif
 
+  XInitThreads ();
+
   gtk_init (&argc, &argv);
 
 #ifdef HAVE_PUTENV


What I don't understand is:
1) Are gdk_threads_init() and gdk_threads_enter()/gdk_threads_leave()
necessary?
2) Why gdk_threads_init() doesn't call XInitThreads()? Is proper usage
of gdk_threads_* functions supposed to prevent concurrent access to
Xlib?



-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to