RingRacers/libs/SDL2/test/torturethread.c
James R fd3b045f80 Update libs/SDL2 to 2.0.22
# Conflicts:
#	libs/SDL2/COPYING.txt
#	libs/SDL2/WhatsNew.txt
#	libs/SDL2/docs/README-android.md
#	libs/SDL2/docs/README-linux.md
#	libs/SDL2/i686-w64-mingw32/bin/SDL2.dll
#	libs/SDL2/i686-w64-mingw32/bin/sdl2-config
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_assert.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_atomic.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_audio.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_bits.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_blendmode.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_clipboard.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_config.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_cpuinfo.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_egl.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_endian.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_error.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_events.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_filesystem.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_gamecontroller.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_gesture.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_haptic.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_hints.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_joystick.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_keyboard.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_keycode.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_loadso.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_log.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_main.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_messagebox.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_mouse.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_mutex.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_name.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_opengl.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_opengles.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_opengles2.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_pixels.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_platform.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_power.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_quit.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_rect.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_render.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_revision.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_rwops.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_scancode.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_sensor.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_shape.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_stdinc.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_surface.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_system.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_syswm.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_test.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_test_assert.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_test_common.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_test_compare.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_test_crc32.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_test_font.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_test_fuzzer.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_test_harness.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_test_images.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_test_log.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_test_md5.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_test_memory.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_test_random.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_thread.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_timer.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_touch.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_types.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_version.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_video.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/SDL_vulkan.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/begin_code.h
#	libs/SDL2/i686-w64-mingw32/include/SDL2/close_code.h
#	libs/SDL2/i686-w64-mingw32/lib/libSDL2.a
#	libs/SDL2/i686-w64-mingw32/lib/libSDL2.dll.a
#	libs/SDL2/i686-w64-mingw32/lib/libSDL2.la
#	libs/SDL2/i686-w64-mingw32/lib/libSDL2_test.a
#	libs/SDL2/i686-w64-mingw32/lib/libSDL2_test.la
#	libs/SDL2/i686-w64-mingw32/lib/libSDL2main.a
#	libs/SDL2/i686-w64-mingw32/lib/libSDL2main.la
#	libs/SDL2/i686-w64-mingw32/lib/pkgconfig/sdl2.pc
#	libs/SDL2/test/Makefile.in
#	libs/SDL2/test/Makefile.os2
#	libs/SDL2/test/checkkeys.c
#	libs/SDL2/test/configure.ac
#	libs/SDL2/test/controllermap.c
#	libs/SDL2/test/loopwave.c
#	libs/SDL2/test/loopwavequeue.c
#	libs/SDL2/test/testatomic.c
#	libs/SDL2/test/testaudiocapture.c
#	libs/SDL2/test/testaudiohotplug.c
#	libs/SDL2/test/testaudioinfo.c
#	libs/SDL2/test/testautomation.c
#	libs/SDL2/test/testbounds.c
#	libs/SDL2/test/testcustomcursor.c
#	libs/SDL2/test/testdisplayinfo.c
#	libs/SDL2/test/testdraw2.c
#	libs/SDL2/test/testdrawchessboard.c
#	libs/SDL2/test/testdropfile.c
#	libs/SDL2/test/testerror.c
#	libs/SDL2/test/testfile.c
#	libs/SDL2/test/testfilesystem.c
#	libs/SDL2/test/testgamecontroller.c
#	libs/SDL2/test/testgesture.c
#	libs/SDL2/test/testgl2.c
#	libs/SDL2/test/testgles.c
#	libs/SDL2/test/testgles2.c
#	libs/SDL2/test/testhotplug.c
#	libs/SDL2/test/testiconv.c
#	libs/SDL2/test/testime.c
#	libs/SDL2/test/testintersections.c
#	libs/SDL2/test/testjoystick.c
#	libs/SDL2/test/testkeys.c
#	libs/SDL2/test/testloadso.c
#	libs/SDL2/test/testlock.c
#	libs/SDL2/test/testmessage.c
#	libs/SDL2/test/testmultiaudio.c
#	libs/SDL2/test/testnative.c
#	libs/SDL2/test/testnative.h
#	libs/SDL2/test/testnativew32.c
#	libs/SDL2/test/testnativex11.c
#	libs/SDL2/test/testoverlay2.c
#	libs/SDL2/test/testplatform.c
#	libs/SDL2/test/testpower.c
#	libs/SDL2/test/testqsort.c
#	libs/SDL2/test/testrelative.c
#	libs/SDL2/test/testrendercopyex.c
#	libs/SDL2/test/testrendertarget.c
#	libs/SDL2/test/testresample.c
#	libs/SDL2/test/testrumble.c
#	libs/SDL2/test/testscale.c
#	libs/SDL2/test/testsem.c
#	libs/SDL2/test/testsensor.c
#	libs/SDL2/test/testshader.c
#	libs/SDL2/test/testshape.c
#	libs/SDL2/test/testsprite2.c
#	libs/SDL2/test/testspriteminimal.c
#	libs/SDL2/test/teststreaming.c
#	libs/SDL2/test/testthread.c
#	libs/SDL2/test/testtimer.c
#	libs/SDL2/test/testver.c
#	libs/SDL2/test/testviewport.c
#	libs/SDL2/test/testvulkan.c
#	libs/SDL2/test/testwm2.c
#	libs/SDL2/test/testyuv.c
#	libs/SDL2/test/testyuv_cvt.c
#	libs/SDL2/test/testyuv_cvt.h
#	libs/SDL2/test/torturethread.c
#	libs/SDL2/x86_64-w64-mingw32/bin/SDL2.dll
#	libs/SDL2/x86_64-w64-mingw32/bin/sdl2-config
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_assert.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_atomic.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_audio.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_bits.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_blendmode.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_clipboard.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_config.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_cpuinfo.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_egl.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_endian.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_error.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_events.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_filesystem.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_gamecontroller.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_gesture.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_haptic.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_hints.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_joystick.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_keyboard.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_keycode.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_loadso.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_log.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_main.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_messagebox.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_mouse.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_mutex.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_name.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_opengl.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_opengles.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_opengles2.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_pixels.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_platform.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_power.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_quit.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_rect.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_render.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_revision.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_rwops.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_scancode.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_sensor.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_shape.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_stdinc.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_surface.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_system.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_syswm.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_test.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_test_assert.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_test_common.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_test_compare.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_test_crc32.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_test_font.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_test_fuzzer.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_test_harness.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_test_images.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_test_log.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_test_md5.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_test_memory.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_test_random.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_thread.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_timer.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_touch.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_types.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_version.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_video.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/SDL_vulkan.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/begin_code.h
#	libs/SDL2/x86_64-w64-mingw32/include/SDL2/close_code.h
#	libs/SDL2/x86_64-w64-mingw32/lib/libSDL2.a
#	libs/SDL2/x86_64-w64-mingw32/lib/libSDL2.dll.a
#	libs/SDL2/x86_64-w64-mingw32/lib/libSDL2.la
#	libs/SDL2/x86_64-w64-mingw32/lib/libSDL2_test.a
#	libs/SDL2/x86_64-w64-mingw32/lib/libSDL2_test.la
#	libs/SDL2/x86_64-w64-mingw32/lib/libSDL2main.a
#	libs/SDL2/x86_64-w64-mingw32/lib/libSDL2main.la
#	libs/SDL2/x86_64-w64-mingw32/lib/pkgconfig/sdl2.pc
2022-09-05 15:13:45 +01:00

113 lines
2.8 KiB
C

/*
Copyright (C) 1997-2022 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely.
*/
/* Simple test of the SDL threading code */
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include "SDL.h"
#define NUMTHREADS 10
static SDL_atomic_t time_for_threads_to_die[NUMTHREADS];
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
static void
quit(int rc)
{
SDL_Quit();
exit(rc);
}
int SDLCALL
SubThreadFunc(void *data)
{
while (!*(int volatile *) data) {
; /* SDL_Delay(10); *//* do nothing */
}
return 0;
}
int SDLCALL
ThreadFunc(void *data)
{
SDL_Thread *sub_threads[NUMTHREADS];
int flags[NUMTHREADS];
int i;
int tid = (int) (uintptr_t) data;
SDL_Log("Creating Thread %d\n", tid);
for (i = 0; i < NUMTHREADS; i++) {
char name[64];
SDL_snprintf(name, sizeof (name), "Child%d_%d", tid, i);
flags[i] = 0;
sub_threads[i] = SDL_CreateThread(SubThreadFunc, name, &flags[i]);
}
SDL_Log("Thread '%d' waiting for signal\n", tid);
while (SDL_AtomicGet(&time_for_threads_to_die[tid]) != 1) {
; /* do nothing */
}
SDL_Log("Thread '%d' sending signals to subthreads\n", tid);
for (i = 0; i < NUMTHREADS; i++) {
flags[i] = 1;
SDL_WaitThread(sub_threads[i], NULL);
}
SDL_Log("Thread '%d' exiting!\n", tid);
return 0;
}
int
main(int argc, char *argv[])
{
SDL_Thread *threads[NUMTHREADS];
int i;
/* Enable standard application logging */
SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
/* Load the SDL library */
if (SDL_Init(0) < 0) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
return (1);
}
signal(SIGSEGV, SIG_DFL);
for (i = 0; i < NUMTHREADS; i++) {
char name[64];
SDL_snprintf(name, sizeof (name), "Parent%d", i);
SDL_AtomicSet(&time_for_threads_to_die[i], 0);
threads[i] = SDL_CreateThread(ThreadFunc, name, (void*) (uintptr_t) i);
if (threads[i] == NULL) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create thread: %s\n", SDL_GetError());
quit(1);
}
}
for (i = 0; i < NUMTHREADS; i++) {
SDL_AtomicSet(&time_for_threads_to_die[i], 1);
}
for (i = 0; i < NUMTHREADS; i++) {
SDL_WaitThread(threads[i], NULL);
}
SDL_Quit();
return (0);
}