Home | History | Annotate | Download | only in test
      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 
     13 static SDL_mutex *mutex = NULL;
     14 static Uint32 mainthread;
     15 static SDL_Thread *threads[6];
     16 static volatile int doterminate = 0;
     17 
     18 /*
     19  * SDL_Quit() shouldn't be used with atexit() directly because
     20  *  calling conventions may differ...
     21  */
     22 static void SDL_Quit_Wrapper(void)
     23 {
     24 	SDL_Quit();
     25 }
     26 
     27 void printid(void)
     28 {
     29 	printf("Process %u:  exiting\n", SDL_ThreadID());
     30 }
     31 
     32 void terminate(int sig)
     33 {
     34 	signal(SIGINT, terminate);
     35 	doterminate = 1;
     36 }
     37 void 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 }
     47 int 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 
     74 int 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