test/testlock.c
author Sam Lantinga <slouken@lokigames.com>
Thu, 26 Apr 2001 16:45:43 +0000
changeset 0 74212992fb08
child 1151 be9c9c8f6d53
permissions -rw-r--r--
Initial revision
     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 #include <stdlib.h>
     9 
    10 #include "SDL.h"
    11 #include "SDL_mutex.h"
    12 #include "SDL_thread.h"
    13 
    14 static SDL_mutex *mutex = NULL;
    15 static Uint32 mainthread;
    16 static SDL_Thread *threads[6];
    17 
    18 void printid(void)
    19 {
    20 	printf("Process %u:  exiting\n", SDL_ThreadID());
    21 }
    22 	
    23 void terminate(int sig)
    24 {
    25 	printf("Process %u:  raising SIGTERM\n", SDL_ThreadID());
    26 	raise(SIGTERM);
    27 }
    28 void closemutex(int sig)
    29 {
    30 	Uint32 id = SDL_ThreadID();
    31 	int i;
    32 	printf("Process %u:  Cleaning up...\n", id == mainthread ? 0 : id);
    33 	for ( i=0; i<6; ++i )
    34 		SDL_KillThread(threads[i]);
    35 	SDL_DestroyMutex(mutex);
    36 	exit(sig);
    37 }
    38 int Run(void *data)
    39 {
    40 	if ( SDL_ThreadID() == mainthread )
    41 		signal(SIGTERM, closemutex);
    42 	while ( 1 ) {
    43 		printf("Process %u ready to work\n", SDL_ThreadID());
    44 		if ( SDL_mutexP(mutex) < 0 ) {
    45 			fprintf(stderr, "Couldn't lock mutex: %s", SDL_GetError());
    46 			exit(1);
    47 		}
    48 		printf("Process %u, working!\n", SDL_ThreadID());
    49 		SDL_Delay(1*1000);
    50 		printf("Process %u, done!\n", SDL_ThreadID());
    51 		if ( SDL_mutexV(mutex) < 0 ) {
    52 			fprintf(stderr, "Couldn't unlock mutex: %s", SDL_GetError());
    53 			exit(1);
    54 		}
    55 		/* If this sleep isn't done, then threads may starve */
    56 		SDL_Delay(10);
    57 	}
    58 	return(0);
    59 }
    60 
    61 int main(int argc, char *argv[])
    62 {
    63 	int i;
    64 	int maxproc = 6;
    65 
    66 	/* Load the SDL library */
    67 	if ( SDL_Init(0) < 0 ) {
    68 		fprintf(stderr, "%s\n", SDL_GetError());
    69 		exit(1);
    70 	}
    71 	atexit(SDL_Quit);
    72 
    73 	if ( (mutex=SDL_CreateMutex()) == NULL ) {
    74 		fprintf(stderr, "Couldn't create mutex: %s\n", SDL_GetError());
    75 		exit(1);
    76 	}
    77 
    78 	mainthread = SDL_ThreadID();
    79 	printf("Main thread: %u\n", mainthread);
    80 	atexit(printid);
    81 	for ( i=0; i<maxproc; ++i ) {
    82 		if ( (threads[i]=SDL_CreateThread(Run, NULL)) == NULL )
    83 			fprintf(stderr, "Couldn't create thread!\n");
    84 	}
    85 	signal(SIGINT, terminate);
    86 	Run(NULL);
    87 
    88 	return(0);	/* Never reached */
    89 }