.hgtags
author Sam Lantinga <slouken@libsdl.org>
Thu, 13 Oct 2016 04:54:43 -0700
changeset 10530 2a3f8bc23daa
parent 10002 c9cce8633f13
child 10557 71d4148e32de
permissions -rw-r--r--
Fixed bug 3328 - Race condition in Wayland_VideoInit

Robert Folland

When running this little test program with SDL2 on Wayland it often crashes in SDL_Init.

From a backtrace it is apparent that there is a race condition in creating a xkb_context_ref. Sometimes it is 0x0.

By moving the relevant lines higher up in Wayland_VideoInit (in SDL2-2.0.4/src/video/wayland/SDL_waylandvideo.c:302) this seems to get fixed.

I moved the call to WAYLAND_xkb_context_new() up to before the call to WAYLAND_wl_display_connect().

Here is the test program (just a loop of init and quit), and a backtrace from gdb:

#include <cstdio>
#include <stdlib.h>
#include <SDL2/SDL.h>
#include <unistd.h>
#include <iostream>

int main(int argc, char **argv)
{
int count = atoi(argv[1]);

for (int i = 0; i < count; i++) {
std::cout << "Init " << i << std::endl;
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"Couldn't initialize SDL: %s\n",
SDL_GetError());
return 1;
}
std::cout << "Quit" << std::endl;
SDL_Quit();
}
return 0;
}


Init 12
Quit
Init 13

Program received signal SIGSEGV, Segmentation fault.
xkb_context_ref (ctx=ctx@entry=0x0) at src/context.c:156
156 ctx->refcnt++;
(gdb) bt
#0 xkb_context_ref (ctx=ctx@entry=0x0) at src/context.c:156
#1 0x00007ffff5e1cd4c in xkb_keymap_new (ctx=0x0, format=XKB_KEYMAP_FORMAT_TEXT_V1, flags=flags@entry=XKB_KEYMAP_COMPILE_NO_FLAGS) at src/keymap-priv.c:65
#2 0x00007ffff5e1c6cc in xkb_keymap_new_from_buffer (ctx=<optimized out>,
buffer=0x7ffff7fd5000 "xkb_keymap {\nxkb_keycodes \"(unnamed)\" {\n\tminimum = 8;\n\tmaximum = 255;\n\t<ESC>", ' ' <repeats 16 times>, "= 9;\n\t<AE01>", ' ' <re
peats 15 times>, "= 10;\n\t<AE02>", ' ' <repeats 15 times>, "= 11;\n\t<AE03>", ' ' <repeats 15 times>, "= 12;\n\t<AE04>", ' ' <repeats 12 times>..., length=48090,
format=<optimized out>, flags=<optimized out>) at src/keymap.c:191
#3 0x00007ffff7b8ea4e in keyboard_handle_keymap (data=0x6169b0, keyboard=<optimized out>, format=<optimized out>, fd=5, size=48091)
at /home/vlab/abs/sdl2/src/SDL2-2.0.4/src/video/wayland/SDL_waylandevents.c:269
#4 0x00007ffff64501f0 in ffi_call_unix64 () from /usr/lib/libffi.so.6
#5 0x00007ffff644fc58 in ffi_call () from /usr/lib/libffi.so.6
#6 0x00007ffff665be3e in wl_closure_invoke (closure=closure@entry=0x61f000, flags=flags@entry=1, target=<optimized out>, target@entry=0x616d20,
opcode=opcode@entry=0, data=<optimized out>) at src/connection.c:949
#7 0x00007ffff6658be0 in dispatch_event (display=<optimized out>, queue=<optimized out>) at src/wayland-client.c:1274
#8 0x00007ffff6659db4 in dispatch_queue (queue=0x617398, display=0x6172d0) at src/wayland-client.c:1420
#9 wl_display_dispatch_queue_pending (display=0x6172d0, queue=0x617398) at src/wayland-client.c:1662
#10 0x00007ffff665a0cf in wl_display_roundtrip_queue (display=0x6172d0, queue=0x617398) at src/wayland-client.c:1085
#11 0x00007ffff7b8faa0 in Wayland_VideoInit (_this=<optimized out>) at /home/vlab/abs/sdl2/src/SDL2-2.0.4/src/video/wayland/SDL_waylandvideo.c:302
#12 0x00007ffff7b7aed6 in SDL_VideoInit_REAL (driver_name=<optimized out>, driver_name@entry=0x0) at /home/vlab/abs/sdl2/src/SDL2-2.0.4/src/video/SDL_video.c:513
#13 0x00007ffff7ae0ee7 in SDL_InitSubSystem_REAL (flags=16416) at /home/vlab/abs/sdl2/src/SDL2-2.0.4/src/SDL.c:173
#14 0x0000000000400b24 in main (argc=2, argv=0x7fffffffebb8) at vplay-init.cpp:13
(gdb)
     1 0afe0e38e02cf2048e93582f01c52fbb91d3c7bb release-1.2.7
     2 230b156829ed13b31134d96f689c917981f57b84 release-1.2.5
     3 27cab50ec9c746e886ce0f3fdaa0b0cdc55a594f release-1.2.11
     4 2fe3fbd2bff50165b3cad33bf40d70b3bb3c9fd0 release-1.2.3
     5 3c052d3bcc76c899dfd4846be76243a78e8c7180 release-1.2.4
     6 3c5eed71a3320962551af3b3dfbee0c99fcf0086 release-1.2.10
     7 4867f7f7dd3426d1dbbeef48b3f3b3aa19590cc4 release-1.2.12
     8 6e28dae59e3baf4447c83e833a8d2ac912536f5b release-1.2.1
     9 7c2589fb8d4df54c6faabd3faebd0c0e73f67879 release-1.2.13
    10 86de11faf082881ad9b73a1a1d78733ca07f8db8 release-1.2.6
    11 bb051fa871aa0b53ea57df56a446cec3bb85924c release-1.2.2
    12 cfcb2e1c36ebe9809577adf768b0ec53e8768af9 release-1.2.8
    13 e044e7c70a50a2f54d14ee20d0933e904e5853b6 release-1.2.9
    14 f14cf9d71233934811774f941d0de121d5f96ccf release-1.2.14
    15 39c22a953456f6c9e2c8993c8ff973824104102a pre-touch-removal
    16 ccf5fbfa2afabab429ad911308f362201a94d810 macosx_10_4_supported
    17 d6a8fa507a45d9de7258e51585eab3e45c415149 release-2.0.0
    18 a8bd63b33636715f2cf6e7d36ab7201acbd478fe release-2.0.1
    19 a8bd63b33636715f2cf6e7d36ab7201acbd478fe release-2.0.1
    20 715a01415ac9305b9f8ec72b99fcf8cc9dd64dde release-2.0.1
    21 715a01415ac9305b9f8ec72b99fcf8cc9dd64dde release-2.0.1
    22 9ec71e56071cc80eda6691a3f8719ed5395dfcfb release-2.0.1
    23 9ec71e56071cc80eda6691a3f8719ed5395dfcfb release-2.0.1
    24 0000000000000000000000000000000000000000 release-2.0.1
    25 0000000000000000000000000000000000000000 release-2.0.1
    26 b9663c77f5c95ebf05f3c18e80619caae8ae1460 release-2.0.1
    27 be2102f000d0d2d9bab75e9703a1d503d0f6bb33 release-2.0.2
    28 f285b9487756ff681f76c85644222c03a7bfa1c7 release-2.0.3
    29 f285b9487756ff681f76c85644222c03a7bfa1c7 release-2.0.3
    30 704a0bfecf754e4e1383f83c7d5118b00cae26ea release-2.0.3
    31 e12c387305129c847b3928a123300b113782fe3f release-2.0.4