Mercurial > sdl-ios-xcode
annotate test/testlock.c @ 1504:7b4b31075f67
*** empty log message ***
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 13 Mar 2006 01:20:05 +0000 |
parents | be9c9c8f6d53 |
children | 14717b52abc0 |
rev | line source |
---|---|
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 } |