test/testlock.c

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

FUNCTIONS

This source file includes following functions.
  1. printid
  2. terminate
  3. closemutex
  4. Run
  5. main

   1 
   2 /* Test the thread and mutex locking functions 
   3    Also exercises the system's signal/thread interaction
   4 */
   5 
   6 #include <signal.h>
   7 #include <stdio.h>
   8 #include <stdlib.h>
   9 
  10 #include "SDL.h"
  11 #include "SDL_mutex.h"
  12 #include "SDL_thread.h"
  13 
  14 static SDL_mutex *mutex = NULL;
  15 static Uint32 mainthread;
  16 static SDL_Thread *threads[6];
  17 
  18 void printid(void)
     /* [<][>][^][v][top][bottom][index][help] */
  19 {
  20         printf("Process %u:  exiting\n", SDL_ThreadID());
  21 }
  22         
  23 void terminate(int sig)
     /* [<][>][^][v][top][bottom][index][help] */
  24 {
  25         printf("Process %u:  raising SIGTERM\n", SDL_ThreadID());
  26         raise(SIGTERM);
  27 }
  28 void closemutex(int sig)
     /* [<][>][^][v][top][bottom][index][help] */
  29 {
  30         Uint32 id = SDL_ThreadID();
  31         int i;
  32         printf("Process %u:  Cleaning up...\n", id == mainthread ? 0 : id);
  33         for ( i=0; i<6; ++i )
  34                 SDL_KillThread(threads[i]);
  35         SDL_DestroyMutex(mutex);
  36         exit(sig);
  37 }
  38 int Run(void *data)
     /* [<][>][^][v][top][bottom][index][help] */
  39 {
  40         if ( SDL_ThreadID() == mainthread )
  41                 signal(SIGTERM, closemutex);
  42         while ( 1 ) {
  43                 printf("Process %u ready to work\n", SDL_ThreadID());
  44                 if ( SDL_mutexP(mutex) < 0 ) {
  45                         fprintf(stderr, "Couldn't lock mutex: %s", SDL_GetError());
  46                         exit(1);
  47                 }
  48                 printf("Process %u, working!\n", SDL_ThreadID());
  49                 SDL_Delay(1*1000);
  50                 printf("Process %u, done!\n", SDL_ThreadID());
  51                 if ( SDL_mutexV(mutex) < 0 ) {
  52                         fprintf(stderr, "Couldn't unlock mutex: %s", SDL_GetError());
  53                         exit(1);
  54                 }
  55                 /* If this sleep isn't done, then threads may starve */
  56                 SDL_Delay(10);
  57         }
  58         return(0);
  59 }
  60 
  61 int main(int argc, char *argv[])
     /* [<][>][^][v][top][bottom][index][help] */
  62 {
  63         int i;
  64         int maxproc = 6;
  65 
  66         /* Load the SDL library */
  67         if ( SDL_Init(0) < 0 ) {
  68                 fprintf(stderr, "%s\n", SDL_GetError());
  69                 exit(1);
  70         }
  71         atexit(SDL_Quit);
  72 
  73         if ( (mutex=SDL_CreateMutex()) == NULL ) {
  74                 fprintf(stderr, "Couldn't create mutex: %s\n", SDL_GetError());
  75                 exit(1);
  76         }
  77 
  78         mainthread = SDL_ThreadID();
  79         printf("Main thread: %u\n", mainthread);
  80         atexit(printid);
  81         for ( i=0; i<maxproc; ++i ) {
  82                 if ( (threads[i]=SDL_CreateThread(Run, NULL)) == NULL )
  83                         fprintf(stderr, "Couldn't create thread!\n");
  84         }
  85         signal(SIGINT, terminate);
  86         Run(NULL);
  87 
  88         return(0);      /* Never reached */
  89 }

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