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 }