• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  */
SDL_Quit_Wrapper(void)22 static void SDL_Quit_Wrapper(void)
23 {
24 	SDL_Quit();
25 }
26 
printid(void)27 void printid(void)
28 {
29 	printf("Process %u:  exiting\n", SDL_ThreadID());
30 }
31 
terminate(int sig)32 void terminate(int sig)
33 {
34 	signal(SIGINT, terminate);
35 	doterminate = 1;
36 }
closemutex(int sig)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 }
Run(void * data)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 
main(int argc,char * argv[])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