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 [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]