Initial standalone code, some stuff runs
[sdl_omap.git] / test / testsem.c
CommitLineData
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
13static SDL_sem *sem;
14int alive = 1;
15
16int 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
31static void killed(int sig)
32{
33 alive = 0;
34}
35
36int 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}