Atlas - torturethread.c
Home / ext / SDL2 / test Lines: 7 | Size: 2859 bytes [Download] [Show on GitHub] [Search similar files] [Raw] [Raw (proxy)][FILE BEGIN]1/* 2 Copyright (C) 1997-2018 Sam Lantinga <[email protected]> 3 4 This software is provided 'as-is', without any express or implied 5 warranty. In no event will the authors be held liable for any damages 6 arising from the use of this software. 7 8 Permission is granted to anyone to use this software for any purpose, 9 including commercial applications, and to alter it and redistribute it 10 freely. 11*/ 12 13/* Simple test of the SDL threading code */ 14 15#include <stdio.h> 16#include <stdlib.h> 17#include <signal.h> 18#include <string.h> 19 20#include "SDL.h" 21 22#define NUMTHREADS 10 23 24static SDL_atomic_t time_for_threads_to_die[NUMTHREADS]; 25 26/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ 27static void 28quit(int rc) 29{ 30 SDL_Quit(); 31 exit(rc); 32} 33 34int SDLCALL 35SubThreadFunc(void *data) 36{ 37 while (!*(int volatile *) data) { 38 ; /* SDL_Delay(10); *//* do nothing */ 39 } 40 return 0; 41} 42 43int SDLCALL 44ThreadFunc(void *data) 45{ 46 SDL_Thread *sub_threads[NUMTHREADS]; 47 int flags[NUMTHREADS]; 48 int i; 49 int tid = (int) (uintptr_t) data; 50 51 SDL_Log("Creating Thread %d\n", tid); 52 53 for (i = 0; i < NUMTHREADS; i++) { 54 char name[64]; 55 SDL_snprintf(name, sizeof (name), "Child%d_%d", tid, i); 56 flags[i] = 0; 57 sub_threads[i] = SDL_CreateThread(SubThreadFunc, name, &flags[i]); 58 } 59 60 SDL_Log("Thread '%d' waiting for signal\n", tid); 61 while (SDL_AtomicGet(&time_for_threads_to_die[tid]) != 1) { 62 ; /* do nothing */ 63 } 64 65 SDL_Log("Thread '%d' sending signals to subthreads\n", tid); 66 for (i = 0; i < NUMTHREADS; i++) { 67 flags[i] = 1; 68 SDL_WaitThread(sub_threads[i], NULL); 69 } 70 71 SDL_Log("Thread '%d' exiting!\n", tid); 72 73 return 0; 74} 75 76int 77main(int argc, char *argv[]) 78{ 79 SDL_Thread *threads[NUMTHREADS]; 80 int i; 81 82 /* Enable standard application logging */ 83 SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO); 84 85 /* Load the SDL library */ 86 if (SDL_Init(0) < 0) { 87 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError()); 88 return (1); 89 } 90 91 signal(SIGSEGV, SIG_DFL); 92 for (i = 0; i < NUMTHREADS; i++) { 93 char name[64]; 94 SDL_snprintf(name, sizeof (name), "Parent%d", i); 95 SDL_AtomicSet(&time_for_threads_to_die[i], 0); 96 threads[i] = SDL_CreateThread(ThreadFunc, name, (void*) (uintptr_t) i); 97 98 if (threads[i] == NULL) { 99 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create thread: %s\n", SDL_GetError()); 100 quit(1); 101 } 102 } 103 104 for (i = 0; i < NUMTHREADS; i++) { 105 SDL_AtomicSet(&time_for_threads_to_die[i], 1); 106 } 107 108 for (i = 0; i < NUMTHREADS; i++) { 109 SDL_WaitThread(threads[i], NULL); 110 } 111 SDL_Quit(); 112 return (0); 113} 114[FILE END](C) 2025 0x4248 (C) 2025 4248 Media and 4248 Systems, All part of 0x4248 See LICENCE files for more information. Not all files are by 0x4248 always check Licencing.