|
1 |
|
2 /* Simple test of the SDL semaphore code */ |
|
3 |
|
4 #include <stdio.h> |
|
5 #include <stdlib.h> |
|
6 #include <signal.h> |
|
7 |
|
8 #include "SDL.h" |
|
9 #include "SDL_thread.h" |
|
10 |
|
11 #define NUM_THREADS 10 |
|
12 |
|
13 static SDL_sem *sem; |
|
14 int alive = 1; |
|
15 |
|
16 int SDLCALL ThreadFunc(void *data) |
|
17 { |
|
18 int threadnum = (int)(uintptr_t)data; |
|
19 while ( alive ) { |
|
20 SDL_SemWait(sem); |
|
21 fprintf(stderr, "Thread number %d has got the semaphore (value = %d)!\n", threadnum, SDL_SemValue(sem)); |
|
22 SDL_Delay(200); |
|
23 SDL_SemPost(sem); |
|
24 fprintf(stderr, "Thread number %d has released the semaphore (value = %d)!\n", threadnum, SDL_SemValue(sem)); |
|
25 SDL_Delay(1); /* For the scheduler */ |
|
26 } |
|
27 printf("Thread number %d exiting.\n", threadnum); |
|
28 return 0; |
|
29 } |
|
30 |
|
31 static void killed(int sig) |
|
32 { |
|
33 alive = 0; |
|
34 } |
|
35 |
|
36 int main(int argc, char **argv) |
|
37 { |
|
38 SDL_Thread *threads[NUM_THREADS]; |
|
39 uintptr_t i; |
|
40 int init_sem; |
|
41 |
|
42 if(argc < 2) { |
|
43 fprintf(stderr,"Usage: %s init_value\n", argv[0]); |
|
44 return(1); |
|
45 } |
|
46 |
|
47 /* Load the SDL library */ |
|
48 if ( SDL_Init(0) < 0 ) { |
|
49 fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); |
|
50 return(1); |
|
51 } |
|
52 signal(SIGTERM, killed); |
|
53 signal(SIGINT, killed); |
|
54 |
|
55 init_sem = atoi(argv[1]); |
|
56 sem = SDL_CreateSemaphore(init_sem); |
|
57 |
|
58 printf("Running %d threads, semaphore value = %d\n", NUM_THREADS, init_sem); |
|
59 /* Create all the threads */ |
|
60 for( i = 0; i < NUM_THREADS; ++i ) { |
|
61 threads[i] = SDL_CreateThread(ThreadFunc, (void*)i); |
|
62 } |
|
63 |
|
64 /* Wait 10 seconds */ |
|
65 SDL_Delay(10 * 1000); |
|
66 |
|
67 /* Wait for all threads to finish */ |
|
68 printf("Waiting for threads to finish\n"); |
|
69 alive = 0; |
|
70 for( i = 0; i < NUM_THREADS; ++i ) { |
|
71 SDL_WaitThread(threads[i], NULL); |
|
72 } |
|
73 printf("Finished waiting for threads\n"); |
|
74 |
|
75 SDL_DestroySemaphore(sem); |
|
76 SDL_Quit(); |
|
77 return(0); |
|
78 } |