Makefile.wiz
author Sam Lantinga <slouken@libsdl.org>
Thu, 13 Oct 2016 04:54:43 -0700
changeset 10530 2a3f8bc23daa
parent 10204 d7a20c257421
child 12130 24142c5073a4
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 # Makefile to build the pandora SDL library
     2 WIZSDK = /mythtv/media/devel/toolchains/openwiz/arm-openwiz-linux-gnu
     3 
     4 AR	= $(WIZSDK)/bin/arm-openwiz-linux-gnu-ar
     5 RANLIB	= $(WIZSDK)/bin/arm-openwiz-linux-gnu-ranlib
     6 CC = $(WIZSDK)/bin/arm-openwiz-linux-gnu-gcc
     7 CXX = $(WIZSDK)/bin/arm-openwiz-linux-gnu-g++
     8 STRIP = $(WIZSDK)/bin/arm-openwiz-linux-gnu-strip
     9 
    10 CFLAGS  = -Wall -fPIC -I./include -I$(WIZSDK)/include -DWIZ_GLES_LITE
    11 
    12 TARGET_STATIC  = libSDL2.a
    13 TARGET_SHARED  = libSDL2.so
    14 
    15 SOURCES = ./src/*.c ./src/audio/*.c ./src/cpuinfo/*.c ./src/events/*.c \
    16 	./src/file/*.c ./src/stdlib/*.c ./src/thread/*.c ./src/timer/*.c ./src/video/*.c \
    17 	./src/joystick/*.c ./src/haptic/*.c ./src/video/dummy/*.c ./src/audio/disk/*.c \
    18 	./src/audio/dummy/*.c ./src/loadso/dlopen/*.c ./src/audio/dsp/*.c \
    19 	./src/thread/pthread/SDL_systhread.c ./src/thread/pthread/SDL_syssem.c \
    20 	./src/thread/pthread/SDL_sysmutex.c ./src/thread/pthread/SDL_syscond.c \
    21 	./src/joystick/linux/*.c ./src/haptic/linux/*.c ./src/timer/unix/*.c \
    22 	./src/video/pandora/SDL_pandora.o ./src/video/pandora/SDL_pandora_events.o
    23 	
    24 
    25 OBJECTS = $(shell echo $(SOURCES) | sed -e 's,\.c,\.o,g')
    26 
    27 all: config_copy $(TARGET_STATIC) $(TARGET_SHARED)
    28 
    29 $(TARGET_STATIC): $(OBJECTS)
    30 	$(AR) crv $@ $^
    31 	$(RANLIB) $@
    32 
    33 $(TARGET_SHARED):
    34 	$(CC) -shared -Wl,-soname,$(TARGET_SHARED).0 -o $(TARGET_SHARED).0.0.1  $(OBJECTS)
    35 	ln -s $(TARGET_SHARED).0.0.1 $(TARGET_SHARED).0
    36 	ln -s $(TARGET_SHARED).0 $(TARGET_SHARED)
    37 
    38 config_copy:
    39 	cp include/SDL_config_wiz.h include/SDL_config.h
    40 
    41 clean:
    42 	rm -f $(TARGET_STATIC) $(TARGET_SHARED)* $(OBJECTS)
    43 
    44 install:
    45 	mkdir -p $(WIZSDK)/lib
    46 	mkdir -p $(WIZSDK)/include/SDL2
    47 	cp -f $(TARGET_STATIC) $(WIZSDK)/lib
    48 	cp -f $(TARGET_SHARED).0.0.1 $(WIZSDK)/lib
    49 	rm -f $(WIZSDK)/lib/$(TARGET_SHARED).0 $(WIZSDK)/lib/$(TARGET_SHARED)
    50 	ln -s $(WIZSDK)/lib/$(TARGET_SHARED).0.0.1 $(WIZSDK)/lib/$(TARGET_SHARED).0
    51 	ln -s $(WIZSDK)/lib/$(TARGET_SHARED).0 $(WIZSDK)/lib/$(TARGET_SHARED)
    52 
    53 	cp $(TARGET_STATIC) ../../toolchain/libs
    54 	cp $(TARGET_SHARED).0.0.1 ../../toolchain/libs
    55 	rm -f ../../toolchain/libs/$(TARGET_SHARED).0 ../../toolchain/libs/$(TARGET_SHARED)
    56 	ln -s ../../toolchain/libs/$(TARGET_SHARED).0.0.1 ../../toolchain/libs/$(TARGET_SHARED).0
    57 	ln -s ../../toolchain/libs/$(TARGET_SHARED).0 ../../toolchain/libs/$(TARGET_SHARED)
    58 
    59 	cp $(TARGET_SHARED).0.0.1 ../nehe_demos/build/$(TARGET_SHARED).0
    60 	cp -f include/*.h $(WIZSDK)/include/SDL2/
    61 	cp -f include/*.h ../../toolchain/include/SDL2/