Mercurial > sdl-ios-xcode
comparison test/testlock.c @ 1662:782fd950bd46 SDL-1.3
Revamp of the video system in progress - adding support for multiple displays, multiple windows, and a full video mode selection API.
WARNING: None of the video drivers have been updated for the new API yet! The API is still under design and very fluid.
The code is now run through a consistent indent format:
indent -i4 -nut -nsc -br -ce
The headers are being converted to automatically generate doxygen documentation.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 28 May 2006 13:04:16 +0000 |
parents | 14717b52abc0 |
children | 4da1ee79c9af |
comparison
equal
deleted
inserted
replaced
1661:281d3f4870e5 | 1662:782fd950bd46 |
---|---|
17 | 17 |
18 /* | 18 /* |
19 * SDL_Quit() shouldn't be used with atexit() directly because | 19 * SDL_Quit() shouldn't be used with atexit() directly because |
20 * calling conventions may differ... | 20 * calling conventions may differ... |
21 */ | 21 */ |
22 static void SDL_Quit_Wrapper(void) | 22 static void |
23 SDL_Quit_Wrapper (void) | |
23 { | 24 { |
24 SDL_Quit(); | 25 SDL_Quit (); |
25 } | 26 } |
26 | 27 |
27 void printid(void) | 28 void |
29 printid (void) | |
28 { | 30 { |
29 printf("Process %u: exiting\n", SDL_ThreadID()); | 31 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 } | 32 } |
73 | 33 |
74 int main(int argc, char *argv[]) | 34 void |
35 terminate (int sig) | |
75 { | 36 { |
76 int i; | 37 signal (SIGINT, terminate); |
77 int maxproc = 6; | 38 doterminate = 1; |
39 } | |
78 | 40 |
79 /* Load the SDL library */ | 41 void |
80 if ( SDL_Init(0) < 0 ) { | 42 closemutex (int sig) |
81 fprintf(stderr, "%s\n", SDL_GetError()); | 43 { |
82 exit(1); | 44 Uint32 id = SDL_ThreadID (); |
83 } | 45 int i; |
84 atexit(SDL_Quit_Wrapper); | 46 printf ("Process %u: Cleaning up...\n", id == mainthread ? 0 : id); |
47 for (i = 0; i < 6; ++i) | |
48 SDL_KillThread (threads[i]); | |
49 SDL_DestroyMutex (mutex); | |
50 exit (sig); | |
51 } | |
85 | 52 |
86 if ( (mutex=SDL_CreateMutex()) == NULL ) { | 53 int SDLCALL |
87 fprintf(stderr, "Couldn't create mutex: %s\n", SDL_GetError()); | 54 Run (void *data) |
88 exit(1); | 55 { |
89 } | 56 if (SDL_ThreadID () == mainthread) |
57 signal (SIGTERM, closemutex); | |
58 while (1) { | |
59 printf ("Process %u ready to work\n", SDL_ThreadID ()); | |
60 if (SDL_mutexP (mutex) < 0) { | |
61 fprintf (stderr, "Couldn't lock mutex: %s", SDL_GetError ()); | |
62 exit (1); | |
63 } | |
64 printf ("Process %u, working!\n", SDL_ThreadID ()); | |
65 SDL_Delay (1 * 1000); | |
66 printf ("Process %u, done!\n", SDL_ThreadID ()); | |
67 if (SDL_mutexV (mutex) < 0) { | |
68 fprintf (stderr, "Couldn't unlock mutex: %s", SDL_GetError ()); | |
69 exit (1); | |
70 } | |
71 /* If this sleep isn't done, then threads may starve */ | |
72 SDL_Delay (10); | |
73 if (SDL_ThreadID () == mainthread && doterminate) { | |
74 printf ("Process %u: raising SIGTERM\n", SDL_ThreadID ()); | |
75 raise (SIGTERM); | |
76 } | |
77 } | |
78 return (0); | |
79 } | |
90 | 80 |
91 mainthread = SDL_ThreadID(); | 81 int |
92 printf("Main thread: %u\n", mainthread); | 82 main (int argc, char *argv[]) |
93 atexit(printid); | 83 { |
94 for ( i=0; i<maxproc; ++i ) { | 84 int i; |
95 if ( (threads[i]=SDL_CreateThread(Run, NULL)) == NULL ) | 85 int maxproc = 6; |
96 fprintf(stderr, "Couldn't create thread!\n"); | |
97 } | |
98 signal(SIGINT, terminate); | |
99 Run(NULL); | |
100 | 86 |
101 return(0); /* Never reached */ | 87 /* Load the SDL library */ |
88 if (SDL_Init (0) < 0) { | |
89 fprintf (stderr, "%s\n", SDL_GetError ()); | |
90 exit (1); | |
91 } | |
92 atexit (SDL_Quit_Wrapper); | |
93 | |
94 if ((mutex = SDL_CreateMutex ()) == NULL) { | |
95 fprintf (stderr, "Couldn't create mutex: %s\n", SDL_GetError ()); | |
96 exit (1); | |
97 } | |
98 | |
99 mainthread = SDL_ThreadID (); | |
100 printf ("Main thread: %u\n", mainthread); | |
101 atexit (printid); | |
102 for (i = 0; i < maxproc; ++i) { | |
103 if ((threads[i] = SDL_CreateThread (Run, NULL)) == NULL) | |
104 fprintf (stderr, "Couldn't create thread!\n"); | |
105 } | |
106 signal (SIGINT, terminate); | |
107 Run (NULL); | |
108 | |
109 return (0); /* Never reached */ | |
102 } | 110 } |