author | Ryan C. Gordon <icculus@icculus.org> |
Wed, 28 Sep 2005 11:36:20 +0000 | |
changeset 1151 | be9c9c8f6d53 |
parent 0 | 74212992fb08 |
child 1659 | 14717b52abc0 |
permissions | -rw-r--r-- |
0 | 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 |
||
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
18 |
/* |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
19 |
* SDL_Quit() shouldn't be used with atexit() directly because |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
20 |
* calling conventions may differ... |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
21 |
*/ |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
22 |
static void SDL_Quit_Wrapper(void) |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
23 |
{ |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
24 |
SDL_Quit(); |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
25 |
} |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
26 |
|
0 | 27 |
void printid(void) |
28 |
{ |
|
29 |
printf("Process %u: exiting\n", SDL_ThreadID()); |
|
30 |
} |
|
31 |
||
32 |
void terminate(int sig) |
|
33 |
{ |
|
34 |
printf("Process %u: raising SIGTERM\n", SDL_ThreadID()); |
|
35 |
raise(SIGTERM); |
|
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 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 |
} |
|
67 |
return(0); |
|
68 |
} |
|
69 |
||
70 |
int main(int argc, char *argv[]) |
|
71 |
{ |
|
72 |
int i; |
|
73 |
int maxproc = 6; |
|
74 |
||
75 |
/* Load the SDL library */ |
|
76 |
if ( SDL_Init(0) < 0 ) { |
|
77 |
fprintf(stderr, "%s\n", SDL_GetError()); |
|
78 |
exit(1); |
|
79 |
} |
|
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
80 |
atexit(SDL_Quit_Wrapper); |
0 | 81 |
|
82 |
if ( (mutex=SDL_CreateMutex()) == NULL ) { |
|
83 |
fprintf(stderr, "Couldn't create mutex: %s\n", SDL_GetError()); |
|
84 |
exit(1); |
|
85 |
} |
|
86 |
||
87 |
mainthread = SDL_ThreadID(); |
|
88 |
printf("Main thread: %u\n", mainthread); |
|
89 |
atexit(printid); |
|
90 |
for ( i=0; i<maxproc; ++i ) { |
|
91 |
if ( (threads[i]=SDL_CreateThread(Run, NULL)) == NULL ) |
|
92 |
fprintf(stderr, "Couldn't create thread!\n"); |
|
93 |
} |
|
94 |
signal(SIGINT, terminate); |
|
95 |
Run(NULL); |
|
96 |
||
97 |
return(0); /* Never reached */ |
|
98 |
} |