comparison test/testlock.c @ 0:74212992fb08

Initial revision
author Sam Lantinga <slouken@lokigames.com>
date Thu, 26 Apr 2001 16:45:43 +0000
parents
children be9c9c8f6d53
comparison
equal deleted inserted replaced
-1:000000000000 0:74212992fb08
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
18 void printid(void)
19 {
20 printf("Process %u: exiting\n", SDL_ThreadID());
21 }
22
23 void terminate(int sig)
24 {
25 printf("Process %u: raising SIGTERM\n", SDL_ThreadID());
26 raise(SIGTERM);
27 }
28 void closemutex(int sig)
29 {
30 Uint32 id = SDL_ThreadID();
31 int i;
32 printf("Process %u: Cleaning up...\n", id == mainthread ? 0 : id);
33 for ( i=0; i<6; ++i )
34 SDL_KillThread(threads[i]);
35 SDL_DestroyMutex(mutex);
36 exit(sig);
37 }
38 int Run(void *data)
39 {
40 if ( SDL_ThreadID() == mainthread )
41 signal(SIGTERM, closemutex);
42 while ( 1 ) {
43 printf("Process %u ready to work\n", SDL_ThreadID());
44 if ( SDL_mutexP(mutex) < 0 ) {
45 fprintf(stderr, "Couldn't lock mutex: %s", SDL_GetError());
46 exit(1);
47 }
48 printf("Process %u, working!\n", SDL_ThreadID());
49 SDL_Delay(1*1000);
50 printf("Process %u, done!\n", SDL_ThreadID());
51 if ( SDL_mutexV(mutex) < 0 ) {
52 fprintf(stderr, "Couldn't unlock mutex: %s", SDL_GetError());
53 exit(1);
54 }
55 /* If this sleep isn't done, then threads may starve */
56 SDL_Delay(10);
57 }
58 return(0);
59 }
60
61 int main(int argc, char *argv[])
62 {
63 int i;
64 int maxproc = 6;
65
66 /* Load the SDL library */
67 if ( SDL_Init(0) < 0 ) {
68 fprintf(stderr, "%s\n", SDL_GetError());
69 exit(1);
70 }
71 atexit(SDL_Quit);
72
73 if ( (mutex=SDL_CreateMutex()) == NULL ) {
74 fprintf(stderr, "Couldn't create mutex: %s\n", SDL_GetError());
75 exit(1);
76 }
77
78 mainthread = SDL_ThreadID();
79 printf("Main thread: %u\n", mainthread);
80 atexit(printid);
81 for ( i=0; i<maxproc; ++i ) {
82 if ( (threads[i]=SDL_CreateThread(Run, NULL)) == NULL )
83 fprintf(stderr, "Couldn't create thread!\n");
84 }
85 signal(SIGINT, terminate);
86 Run(NULL);
87
88 return(0); /* Never reached */
89 }