test/testsem.c

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. ThreadFunc
  2. killed
  3. main

   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)
     /* [<][>][^][v][top][bottom][index][help] */
  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)
     /* [<][>][^][v][top][bottom][index][help] */
  31 {
  32         alive = 0;
  33 }
  34 
  35 int main(int argc, char **argv)
     /* [<][>][^][v][top][bottom][index][help] */
  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 }

/* [<][>][^][v][top][bottom][index][help] */