e14743d1 |
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 | } |