SDL-1.2.14
[sdl_omap.git] / test / testlock.c
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 }