1 /* 2 Copyright (C) 1997-2014 Sam Lantinga <slouken (at) 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 25 static char volatile time_for_threads_to_die[NUMTHREADS]; 26 27 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ 28 static void 29 quit(int rc) 30 { 31 SDL_Quit(); 32 exit(rc); 33 } 34 35 int SDLCALL 36 SubThreadFunc(void *data) 37 { 38 while (!*(int volatile *) data) { 39 ; /* SDL_Delay(10); *//* do nothing */ 40 } 41 return 0; 42 } 43 44 int SDLCALL 45 ThreadFunc(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 77 int 78 main(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 } 115