Python GTK consistently crashes with XInitThreads related errors

Hi -

During manually testing on Linux our GTK3 Python application consistently crashes when I click a sequence of buttons and dumps the error:

[xcb] Unknown request in queue while dequeuing
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
python3: ../../src/xcb_io.c:175: dequeue_pending_request: Assertion `!xcb_xlib_unknown_req_in_deq' failed.
Aborted (core dumped)

When I export GDK_SYNCHRONIZE=1 and debug the application with GDB I get the following stacktrace:

Thread 1 "python3" received signal SIGABRT, Aborted.
__pthread_kill_implementation (no_tid=0, signo=6, threadid=140737352511488) at ./nptl/pthread_kill.c:44
44	./nptl/pthread_kill.c: No such file or directory.
(gdb) bt
#0  __pthread_kill_implementation (no_tid=0, signo=6, threadid=140737352511488) at ./nptl/pthread_kill.c:44
#1  __pthread_kill_internal (signo=6, threadid=140737352511488) at ./nptl/pthread_kill.c:78
#2  __GI___pthread_kill (threadid=140737352511488, signo=signo@entry=6) at ./nptl/pthread_kill.c:89
#3  0x00007ffff7c42476 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#4  0x00007ffff7c287f3 in __GI_abort () at ./stdlib/abort.c:79
#5  0x00007ffff7c2871b in __assert_fail_base
    (fmt=0x7ffff7ddd130 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=0x7ffff64b7cc0 "!xcb_xlib_threads_sequence_lost", file=0x7ffff64b78c0 "../../src/xcb_io.c", line=730, function=<optimised out>) at ./assert/assert.c:92
#6  0x00007ffff7c39e96 in __GI___assert_fail (assertion=0x7ffff64b7cc0 "!xcb_xlib_threads_sequence_lost", file=0x7ffff64b78c0 "../../src/xcb_io.c", line=730, function=0x7ffff64b8280 "_XReply")
    at ./assert/assert.c:101
#7  0x00007ffff6448694 in _XReply () at /lib/x86_64-linux-gnu/libX11.so.6
#8  0x00007ffff644877f in XSync () at /lib/x86_64-linux-gnu/libX11.so.6
#9  0x00007ffff644881f in  () at /lib/x86_64-linux-gnu/libX11.so.6
#10 0x00007ffff6448b37 in  () at /lib/x86_64-linux-gnu/libX11.so.6
#11 0x00007ffff641f347 in XCreatePixmap () at /lib/x86_64-linux-gnu/libX11.so.6
#12 0x00007ffff6823f85 in  () at /lib/x86_64-linux-gnu/libcairo.so.2
#13 0x00007ffff67fa108 in  () at /lib/x86_64-linux-gnu/libcairo.so.2
#14 0x00007ffff6822732 in  () at /lib/x86_64-linux-gnu/libcairo.so.2
#15 0x00007ffff6801001 in  () at /lib/x86_64-linux-gnu/libcairo.so.2
#16 0x00007ffff68012e6 in  () at /lib/x86_64-linux-gnu/libcairo.so.2
#17 0x00007ffff67a6891 in  () at /lib/x86_64-linux-gnu/libcairo.so.2
#18 0x00007ffff67f8718 in  () at /lib/x86_64-linux-gnu/libcairo.so.2
#19 0x00007ffff67aedea in  () at /lib/x86_64-linux-gnu/libcairo.so.2
#20 0x00007ffff680641e in cairo_paint () at /lib/x86_64-linux-gnu/libcairo.so.2
#21 0x00007ffff636006e in pycairo_paint (o=0x7fffca16d530, ignored=<optimised out>) at cairo/context.c:666
#22 0x00005555556b26c7 in  ()
#23 0x000055555569745c in _PyEval_EvalFrameDefault ()
#24 0x00005555556bc93e in  ()
#25 0x00007ffff6dd0cf4 in pygi_signal_closure_marshal
    (closure=0x555557cc0980, return_value=0x7fffffffac40, n_param_values=2, param_values=0x7fffffffaca0, invocation_hint=<optimised out>, marshal_data=<optimised out>) at gi/pygi-signal-closure.c:197
#26 0x00007ffff6c1dd2f in g_closure_invoke () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#27 0x00007ffff6c39c36 in  () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#28 0x00007ffff6c3b026 in g_signal_emit_valist () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#29 0x00007ffff6c3b863 in g_signal_emit () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#30 0x00007ffff559fd82 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#31 0x00007ffff5380825 in gtk_container_propagate_draw () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#32 0x00007ffff538092d in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#33 0x00007ffff5322571 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#34 0x00007ffff53782e1 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#35 0x00007ffff538c852 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#36 0x00007ffff5322e15 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#37 0x00007ffff559fb64 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#38 0x00007ffff5380825 in gtk_container_propagate_draw () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#39 0x00007ffff54788e2 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#40 0x00007ffff53782e1 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#41 0x00007ffff538c852 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#42 0x00007ffff533421e in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#43 0x00007ffff538c852 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#44 0x00007ffff5478934 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#45 0x00007ffff559fb64 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#46 0x00007ffff5380825 in gtk_container_propagate_draw () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#47 0x00007ffff538092d in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#48 0x00007ffff5322571 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#49 0x00007ffff53782e1 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#50 0x00007ffff538c852 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#51 0x00007ffff5322e15 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#52 0x00007ffff559fb64 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#53 0x00007ffff5380825 in gtk_container_propagate_draw () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#54 0x00007ffff538092d in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#55 0x00007ffff5322571 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#56 0x00007ffff53782e1 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#57 0x00007ffff538c852 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#58 0x00007ffff5322e15 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#59 0x00007ffff559fb64 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#60 0x00007ffff5380825 in gtk_container_propagate_draw () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#61 0x00007ffff54881a4 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#62 0x00007ffff53782e1 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#63 0x00007ffff538c852 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#64 0x00007ffff5480405 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#65 0x00007ffff559fb64 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#66 0x00007ffff5380825 in gtk_container_propagate_draw () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#67 0x00007ffff538092d in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#68 0x00007ffff54a783d in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#69 0x00007ffff5596251 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#70 0x00007ffff53782e1 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#71 0x00007ffff538c852 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#72 0x00007ffff55962a1 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#73 0x00007ffff559fb64 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#74 0x00007ffff5380825 in gtk_container_propagate_draw () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#75 0x00007ffff538092d in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#76 0x00007ffff54d7872 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#77 0x00007ffff53782e1 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#78 0x00007ffff538c852 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#79 0x00007ffff54cfb65 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#80 0x00007ffff559fb64 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#81 0x00007ffff5380825 in gtk_container_propagate_draw () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#82 0x00007ffff54881a4 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#83 0x00007ffff53782e1 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#84 0x00007ffff538c852 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#85 0x00007ffff5480405 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#86 0x00007ffff559fb64 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#87 0x00007ffff5380825 in gtk_container_propagate_draw () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#88 0x00007ffff538092d in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#89 0x00007ffff5322571 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#90 0x00007ffff53782e1 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#91 0x00007ffff538c852 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#92 0x00007ffff5322e15 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#93 0x00007ffff559fb64 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#94 0x00007ffff5380825 in gtk_container_propagate_draw () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#95 0x00007ffff548810c in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#96 0x00007ffff53782e1 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#97 0x00007ffff538c852 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#98 0x00007ffff5480405 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#99 0x00007ffff559fb64 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#100 0x00007ffff5380825 in gtk_container_propagate_draw () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#101 0x00007ffff538092d in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#102 0x00007ffff5322571 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#103 0x00007ffff53782e1 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#104 0x00007ffff538c852 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#105 0x00007ffff5322e15 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#106 0x00007ffff559fb64 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#107 0x00007ffff5380825 in gtk_container_propagate_draw () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#108 0x00007ffff538092d in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#109 0x00007ffff55c060e in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#110 0x00007ffff559fb64 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#111 0x00007ffff55abdb1 in  () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#112 0x00007ffff545254b in gtk_main_do_event () at /lib/x86_64-linux-gnu/libgtk-3.so.0
#113 0x00007ffff5e33743 in  () at /lib/x86_64-linux-gnu/libgdk-3.so.0
#114 0x00007ffff5e46151 in  () at /lib/x86_64-linux-gnu/libgdk-3.so.0
#115 0x00007ffff5e4b221 in  () at /lib/x86_64-linux-gnu/libgdk-3.so.0
#116 0x00007ffff5e4b418 in  () at /lib/x86_64-linux-gnu/libgdk-3.so.0
#117 0x00007ffff6c3b700 in g_signal_emit_valist () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#118 0x00007ffff6c3b863 in g_signal_emit () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#119 0x00007ffff5e40c6f in  () at /lib/x86_64-linux-gnu/libgdk-3.so.0
#120 0x00007ffff5e2d2ad in  () at /lib/x86_64-linux-gnu/libgdk-3.so.0
#121 0x00007ffff6cbf2c8 in  () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#122 0x00007ffff6cbec44 in g_main_context_dispatch () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#123 0x00007ffff6d14258 in  () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#124 0x00007ffff6cbc3e3 in g_main_context_iteration () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#125 0x00007ffff6a9afb5 in g_application_run () at /lib/x86_64-linux-gnu/libgio-2.0.so.0
#126 0x00007ffff72fae2e in  () at /lib/x86_64-linux-gnu/libffi.so.8
#127 0x00007ffff72f7493 in  () at /lib/x86_64-linux-gnu/libffi.so.8
#128 0x00007ffff6dcccb5 in pygi_invoke_c_callable (function_cache=0x555557e4aef0, state=<optimised out>, py_args=<optimised out>, py_kwargs=<optimised out>) at gi/pygi-invoke.c:684
#129 0x00007ffff6dc3c3c in pygi_function_cache_invoke (function_cache=<optimised out>, py_args=<optimised out>, py_kwargs=<optimised out>) at gi/pygi-cache.c:862
#130 0x00005555556bd42b in PyObject_Call ()
#131 0x00005555556995d7 in _PyEval_EvalFrameDefault ()
#132 0x00005555556ae9fc in _PyFunction_Vectorcall ()
#133 0x000055555569745c in _PyEval_EvalFrameDefault ()
#134 0x00005555556ae9fc in _PyFunction_Vectorcall ()
#135 0x000055555569726d in _PyEval_EvalFrameDefault ()
#136 0x00005555556939c6 in  ()
#137 0x0000555555789256 in PyEval_EvalCode ()
#138 0x00005555557b4108 in  ()
#139 0x00005555557ad9cb in  ()
#140 0x00005555557b3e55 in  ()
#141 0x00005555557b3338 in _PyRun_SimpleFileObject ()
#142 0x00005555557b2f83 in _PyRun_AnyFileObject ()
#143 0x00005555557a5a5e in Py_RunMain ()
#144 0x000055555577c02d in Py_BytesMain ()
#145 0x00007ffff7c29d90 in __libc_start_call_main (main=main@entry=0x55555577bff0, argc=argc@entry=4, argv=argv@entry=0x7fffffffdf98) at ../sysdeps/nptl/libc_start_call_main.h:58
#146 0x00007ffff7c29e40 in __libc_start_main_impl (main=0x55555577bff0, argc=4, argv=0x7fffffffdf98, init=<optimised out>, fini=<optimised out>, rtld_fini=<optimised out>, stack_end=0x7fffffffdf88)
#147 0x000055555577bf25 in _start ()

I’ve researched this error and I found a similar post on stackoverflow albeit for Qt. I would seem that some X11InitThreads functiojn may need to be called in order to for X11 Windowing functions to be thread safe. (This crash does not happen happen on Windows.)

Please advise.

Regards,

  • Olumide

Yes, you need to initialise threading support in X11 if you want to use multiple threads but you cannot use GTK API from different threads anyway.

Never, ever call GTK API from any thread except the thread that initialised GTK and is spinning the default main loop.

Yes, you need to initialise threading support in X11 if you want to use multiple threads

With what function would I do this? I can’t find a candidate in any of the docs I’ve searched.

Never, ever call GTK API from any thread except the thread that initialised GTK and is spinning the default main loop.

We observe this rule. As you can probably see the stacktrace is in “Thread 1”.

The only function call that threads (can) make is GLib.idle_add to hand work to the main thread.

Something that calls XInitThreads() first thing, before importing GTK.

1 Like

I called XInitThreads this way.

if sys.platform == "linux" or sys.platform == "linux2":
    import ctypes
    ctypes.CDLL('libX11.so').XInitThreads()

Source.

Shouldn’t this functionality be part of GTK?

The call is part of Xlib, and must be called before GTK is initialised, so it cannot be part of GTK.

You got me there! :rofl:

Thanks as always.