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