sdl2-config.in
author Sam Lantinga <slouken@libsdl.org>
Thu, 13 Oct 2016 04:54:43 -0700
changeset 10530 2a3f8bc23daa
parent 7876 d6373384b5ce
child 13729 89a457159af4
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)
slouken@0
     1
#!/bin/sh
slouken@0
     2
slouken@0
     3
prefix=@prefix@
slouken@0
     4
exec_prefix=@exec_prefix@
slouken@0
     5
exec_prefix_set=no
icculus@2100
     6
libdir=@libdir@
slouken@0
     7
slouken@1647
     8
@ENABLE_STATIC_FALSE@usage="\
slouken@6250
     9
@ENABLE_STATIC_FALSE@Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs]"
slouken@1647
    10
@ENABLE_STATIC_TRUE@usage="\
slouken@6250
    11
@ENABLE_STATIC_TRUE@Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs] [--static-libs]"
slouken@0
    12
slouken@0
    13
if test $# -eq 0; then
slouken@0
    14
      echo "${usage}" 1>&2
slouken@0
    15
      exit 1
slouken@0
    16
fi
slouken@0
    17
slouken@0
    18
while test $# -gt 0; do
slouken@0
    19
  case "$1" in
slouken@1895
    20
  -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
slouken@0
    21
  *) optarg= ;;
slouken@0
    22
  esac
slouken@0
    23
slouken@0
    24
  case $1 in
slouken@0
    25
    --prefix=*)
slouken@0
    26
      prefix=$optarg
slouken@0
    27
      if test $exec_prefix_set = no ; then
slouken@0
    28
        exec_prefix=$optarg
slouken@0
    29
      fi
slouken@0
    30
      ;;
slouken@0
    31
    --prefix)
slouken@0
    32
      echo $prefix
slouken@0
    33
      ;;
slouken@0
    34
    --exec-prefix=*)
slouken@0
    35
      exec_prefix=$optarg
slouken@0
    36
      exec_prefix_set=yes
slouken@0
    37
      ;;
slouken@0
    38
    --exec-prefix)
slouken@0
    39
      echo $exec_prefix
slouken@0
    40
      ;;
slouken@0
    41
    --version)
slouken@0
    42
      echo @SDL_VERSION@
slouken@0
    43
      ;;
slouken@0
    44
    --cflags)
slouken@6250
    45
      echo -I@includedir@/SDL2 @SDL_CFLAGS@
slouken@0
    46
      ;;
slouken@0
    47
@ENABLE_SHARED_TRUE@    --libs)
slouken@7876
    48
@ENABLE_SHARED_TRUE@      echo -L@libdir@ @SDL_RLD_FLAGS@ @SDL_LIBS@
slouken@0
    49
@ENABLE_SHARED_TRUE@      ;;
slouken@0
    50
@ENABLE_STATIC_TRUE@@ENABLE_SHARED_TRUE@    --static-libs)
slouken@0
    51
@ENABLE_STATIC_TRUE@@ENABLE_SHARED_FALSE@    --libs|--static-libs)
slouken@1548
    52
@ENABLE_STATIC_TRUE@      echo -L@libdir@ @SDL_RLD_FLAGS@ @SDL_STATIC_LIBS@
slouken@0
    53
@ENABLE_STATIC_TRUE@      ;;
slouken@0
    54
    *)
slouken@0
    55
      echo "${usage}" 1>&2
slouken@0
    56
      exit 1
slouken@0
    57
      ;;
slouken@0
    58
  esac
slouken@0
    59
  shift
slouken@0
    60
done