SDL-1.2.14
[sdl_omap.git] / test / testsem.c
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 }