torturethread.c (2835B)
1/* 2 Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org> 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#include "SDL_thread.h" 22 23#define NUMTHREADS 10 24 25static char volatile time_for_threads_to_die[NUMTHREADS]; 26 27/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ 28static void 29quit(int rc) 30{ 31 SDL_Quit(); 32 exit(rc); 33} 34 35int SDLCALL 36SubThreadFunc(void *data) 37{ 38 while (!*(int volatile *) data) { 39 ; /* SDL_Delay(10); *//* do nothing */ 40 } 41 return 0; 42} 43 44int SDLCALL 45ThreadFunc(void *data) 46{ 47 SDL_Thread *sub_threads[NUMTHREADS]; 48 int flags[NUMTHREADS]; 49 int i; 50 int tid = (int) (uintptr_t) data; 51 52 SDL_Log("Creating Thread %d\n", tid); 53 54 for (i = 0; i < NUMTHREADS; i++) { 55 char name[64]; 56 SDL_snprintf(name, sizeof (name), "Child%d_%d", tid, i); 57 flags[i] = 0; 58 sub_threads[i] = SDL_CreateThread(SubThreadFunc, name, &flags[i]); 59 } 60 61 SDL_Log("Thread '%d' waiting for signal\n", tid); 62 while (time_for_threads_to_die[tid] != 1) { 63 ; /* do nothing */ 64 } 65 66 SDL_Log("Thread '%d' sending signals to subthreads\n", tid); 67 for (i = 0; i < NUMTHREADS; i++) { 68 flags[i] = 1; 69 SDL_WaitThread(sub_threads[i], NULL); 70 } 71 72 SDL_Log("Thread '%d' exiting!\n", tid); 73 74 return 0; 75} 76 77int 78main(int argc, char *argv[]) 79{ 80 SDL_Thread *threads[NUMTHREADS]; 81 int i; 82 83 /* Enable standard application logging */ 84 SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO); 85 86 /* Load the SDL library */ 87 if (SDL_Init(0) < 0) { 88 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError()); 89 return (1); 90 } 91 92 signal(SIGSEGV, SIG_DFL); 93 for (i = 0; i < NUMTHREADS; i++) { 94 char name[64]; 95 SDL_snprintf(name, sizeof (name), "Parent%d", i); 96 time_for_threads_to_die[i] = 0; 97 threads[i] = SDL_CreateThread(ThreadFunc, name, (void*) (uintptr_t) i); 98 99 if (threads[i] == NULL) { 100 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create thread: %s\n", SDL_GetError()); 101 quit(1); 102 } 103 } 104 105 for (i = 0; i < NUMTHREADS; i++) { 106 time_for_threads_to_die[i] = 1; 107 } 108 109 for (i = 0; i < NUMTHREADS; i++) { 110 SDL_WaitThread(threads[i], NULL); 111 } 112 SDL_Quit(); 113 return (0); 114}