XRebindKeysym with XKB deadlocks
I discovered this working with the DtCyber CDC Cyber 175 emulator running on x86_64 under Arch Linux:
: sim; pacman -Q libx11
libx11 1.8.2-2
: sim;
In a nutshell, XRebindKeysym
calls LockDisplay
, does some work, and then calls ComputeMaskFromKeytrans
. The subsequent callchain leading to deadlock is:
-
XkbKeysymToModifiers
, (when XKB is enabled) -
_XkbUnavailable
(a macro) _XkbLoadDpy
XkbGetMap
XkbGetUpdatedMap
LockDisplay
Which then blocks on an already-acquired mutex. A call stack from gdb is as follows:
#0 futex_wait (private=0, expected=2, futex_word=0x7ffff00021e0) at ../sysdeps/nptl/futex-internal.h:146
#1 __GI___lll_lock_wait (futex=futex@entry=0x7ffff00021e0, private=0) at lowlevellock.c:49
#2 0x00007ffff7c2fc12 in lll_mutex_lock_optimized (mutex=0x7ffff00021e0) at pthread_mutex_lock.c:48
#3 ___pthread_mutex_lock (mutex=0x7ffff00021e0) at pthread_mutex_lock.c:93
#4 0x00007ffff7db5edd in _XLockDisplay (dpy=0x7ffff0000b70) at /usr/src/debug/libx11/libX11-1.8.2/src/locking.c:492
#5 0x00007ffff7e1d011 in XkbGetUpdatedMap (xkb=0x7ffff001bf30, which=7, dpy=0x7ffff0000b70) at xkb/XKBGetMap.c:571
#6 XkbGetUpdatedMap (dpy=dpy@entry=0x7ffff0000b70, which=which@entry=7, xkb=xkb@entry=0x7ffff001bf30) at xkb/XKBGetMap.c:562
#7 0x00007ffff7e1d126 in XkbGetMap (dpy=dpy@entry=0x7ffff0000b70, which=which@entry=7, deviceSpec=deviceSpec@entry=256) at xkb/XKBGetMap.c:594
#8 0x00007ffff7e1d19a in _XkbLoadDpy (dpy=dpy@entry=0x7ffff0000b70) at xkb/XKBBind.c:520
#9 0x00007ffff7e1d994 in XkbKeysymToModifiers (dpy=0x7ffff0000b70, ks=65511) at xkb/XKBBind.c:184
#10 0x00007ffff7dbcf3d in ComputeMaskFromKeytrans (p=0x7ffff001b9c0, dpy=0x7ffff0000b70) at /usr/src/debug/libx11/libX11-1.8.2/src/KeyBind.c:1014
#11 XRebindKeysym (dpy=0x7ffff0000b70, keysym=48, mlist=0x7ffff5142d10, nm=1, str=0x5555555ab112 "$0", nbytes=<optimized out>)
at /usr/src/debug/libx11/libX11-1.8.2/src/KeyBind.c:961
#12 0x000055555559aed6 in ?? ()
#13 0x00007ffff7c2c8fd in start_thread (arg=<optimized out>) at pthread_create.c:442
#14 0x00007ffff7caea60 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81
(gdb)