1 2/* Test the thread and mutex locking functions 3 Also exercises the system's signal/thread interaction 4*/ 5 6#include <signal.h> 7#include <stdio.h> 8 9#include "SDL.h" 10#include "SDL_mutex.h" 11#include "SDL_thread.h" 12 13static SDL_mutex *mutex = NULL; 14static Uint32 mainthread; 15static SDL_Thread *threads[6]; 16static volatile int doterminate = 0; 17 18/* 19 * SDL_Quit() shouldn't be used with atexit() directly because 20 * calling conventions may differ... 21 */ 22static void SDL_Quit_Wrapper(void) 23{ 24 SDL_Quit(); 25} 26 27void printid(void) 28{ 29 printf("Process %u: exiting\n", SDL_ThreadID()); 30} 31 32void terminate(int sig) 33{ 34 signal(SIGINT, terminate); 35 doterminate = 1; 36} 37void closemutex(int sig) 38{ 39 Uint32 id = SDL_ThreadID(); 40 int i; 41 printf("Process %u: Cleaning up...\n", id == mainthread ? 0 : id); 42 for ( i=0; i<6; ++i ) 43 SDL_KillThread(threads[i]); 44 SDL_DestroyMutex(mutex); 45 exit(sig); 46} 47int SDLCALL Run(void *data) 48{ 49 if ( SDL_ThreadID() == mainthread ) 50 signal(SIGTERM, closemutex); 51 while ( 1 ) { 52 printf("Process %u ready to work\n", SDL_ThreadID()); 53 if ( SDL_mutexP(mutex) < 0 ) { 54 fprintf(stderr, "Couldn't lock mutex: %s", SDL_GetError()); 55 exit(1); 56 } 57 printf("Process %u, working!\n", SDL_ThreadID()); 58 SDL_Delay(1*1000); 59 printf("Process %u, done!\n", SDL_ThreadID()); 60 if ( SDL_mutexV(mutex) < 0 ) { 61 fprintf(stderr, "Couldn't unlock mutex: %s", SDL_GetError()); 62 exit(1); 63 } 64 /* If this sleep isn't done, then threads may starve */ 65 SDL_Delay(10); 66 if (SDL_ThreadID() == mainthread && doterminate) { 67 printf("Process %u: raising SIGTERM\n", SDL_ThreadID()); 68 raise(SIGTERM); 69 } 70 } 71 return(0); 72} 73 74int main(int argc, char *argv[]) 75{ 76 int i; 77 int maxproc = 6; 78 79 /* Load the SDL library */ 80 if ( SDL_Init(0) < 0 ) { 81 fprintf(stderr, "%s\n", SDL_GetError()); 82 exit(1); 83 } 84 atexit(SDL_Quit_Wrapper); 85 86 if ( (mutex=SDL_CreateMutex()) == NULL ) { 87 fprintf(stderr, "Couldn't create mutex: %s\n", SDL_GetError()); 88 exit(1); 89 } 90 91 mainthread = SDL_ThreadID(); 92 printf("Main thread: %u\n", mainthread); 93 atexit(printid); 94 for ( i=0; i<maxproc; ++i ) { 95 if ( (threads[i]=SDL_CreateThread(Run, NULL)) == NULL ) 96 fprintf(stderr, "Couldn't create thread!\n"); 97 } 98 signal(SIGINT, terminate); 99 Run(NULL); 100 101 return(0); /* Never reached */ 102} 103