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