Mercurial > sdl-ios-xcode
diff test/testlock.c @ 0:74212992fb08
Initial revision
author | Sam Lantinga <slouken@lokigames.com> |
---|---|
date | Thu, 26 Apr 2001 16:45:43 +0000 |
parents | |
children | be9c9c8f6d53 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/testlock.c Thu Apr 26 16:45:43 2001 +0000 @@ -0,0 +1,89 @@ + +/* Test the thread and mutex locking functions + Also exercises the system's signal/thread interaction +*/ + +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> + +#include "SDL.h" +#include "SDL_mutex.h" +#include "SDL_thread.h" + +static SDL_mutex *mutex = NULL; +static Uint32 mainthread; +static SDL_Thread *threads[6]; + +void printid(void) +{ + printf("Process %u: exiting\n", SDL_ThreadID()); +} + +void terminate(int sig) +{ + printf("Process %u: raising SIGTERM\n", SDL_ThreadID()); + raise(SIGTERM); +} +void closemutex(int sig) +{ + Uint32 id = SDL_ThreadID(); + int i; + printf("Process %u: Cleaning up...\n", id == mainthread ? 0 : id); + for ( i=0; i<6; ++i ) + SDL_KillThread(threads[i]); + SDL_DestroyMutex(mutex); + exit(sig); +} +int Run(void *data) +{ + if ( SDL_ThreadID() == mainthread ) + signal(SIGTERM, closemutex); + while ( 1 ) { + printf("Process %u ready to work\n", SDL_ThreadID()); + if ( SDL_mutexP(mutex) < 0 ) { + fprintf(stderr, "Couldn't lock mutex: %s", SDL_GetError()); + exit(1); + } + printf("Process %u, working!\n", SDL_ThreadID()); + SDL_Delay(1*1000); + printf("Process %u, done!\n", SDL_ThreadID()); + if ( SDL_mutexV(mutex) < 0 ) { + fprintf(stderr, "Couldn't unlock mutex: %s", SDL_GetError()); + exit(1); + } + /* If this sleep isn't done, then threads may starve */ + SDL_Delay(10); + } + return(0); +} + +int main(int argc, char *argv[]) +{ + int i; + int maxproc = 6; + + /* Load the SDL library */ + if ( SDL_Init(0) < 0 ) { + fprintf(stderr, "%s\n", SDL_GetError()); + exit(1); + } + atexit(SDL_Quit); + + if ( (mutex=SDL_CreateMutex()) == NULL ) { + fprintf(stderr, "Couldn't create mutex: %s\n", SDL_GetError()); + exit(1); + } + + mainthread = SDL_ThreadID(); + printf("Main thread: %u\n", mainthread); + atexit(printid); + for ( i=0; i<maxproc; ++i ) { + if ( (threads[i]=SDL_CreateThread(Run, NULL)) == NULL ) + fprintf(stderr, "Couldn't create thread!\n"); + } + signal(SIGINT, terminate); + Run(NULL); + + return(0); /* Never reached */ +}