diff options
author | Steve Kondik <shade@chemlab.org> | 2012-11-18 15:47:18 -0800 |
---|---|---|
committer | Steve Kondik <shade@chemlab.org> | 2012-11-18 15:47:18 -0800 |
commit | a546c7006355a7bd1df4267ee53d0bfa2c017c8c (patch) | |
tree | 01be0bf6c0d6968e1468ec9661fd52110f9b05a7 /distrib/sdl-1.2.15/test/testlock.c | |
parent | baf3d7830396202df5cc47bd7bcee109c319cdb3 (diff) | |
parent | 0f809250987b64f491bd3b4b73c0f0d33036a786 (diff) | |
download | external_qemu-a546c7006355a7bd1df4267ee53d0bfa2c017c8c.zip external_qemu-a546c7006355a7bd1df4267ee53d0bfa2c017c8c.tar.gz external_qemu-a546c7006355a7bd1df4267ee53d0bfa2c017c8c.tar.bz2 |
Merge branch 'jb-mr1-release' of https://android.googlesource.com/platform/external/qemu into mr1-staging
Change-Id: I8a4a71ac65b08e6e17f26c942f67a15b85211115
Diffstat (limited to 'distrib/sdl-1.2.15/test/testlock.c')
-rw-r--r-- | distrib/sdl-1.2.15/test/testlock.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/distrib/sdl-1.2.15/test/testlock.c b/distrib/sdl-1.2.15/test/testlock.c new file mode 100644 index 0000000..bda4b55 --- /dev/null +++ b/distrib/sdl-1.2.15/test/testlock.c @@ -0,0 +1,102 @@ + +/* Test the thread and mutex locking functions + Also exercises the system's signal/thread interaction +*/ + +#include <signal.h> +#include <stdio.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]; +static volatile int doterminate = 0; + +/* + * SDL_Quit() shouldn't be used with atexit() directly because + * calling conventions may differ... + */ +static void SDL_Quit_Wrapper(void) +{ + SDL_Quit(); +} + +void printid(void) +{ + printf("Process %u: exiting\n", SDL_ThreadID()); +} + +void terminate(int sig) +{ + signal(SIGINT, terminate); + doterminate = 1; +} +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 SDLCALL 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); + if (SDL_ThreadID() == mainthread && doterminate) { + printf("Process %u: raising SIGTERM\n", SDL_ThreadID()); + raise(SIGTERM); + } + } + 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_Wrapper); + + 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 */ +} |