test/testlock.c
author Sam Lantinga <slouken@libsdl.org>
Sun, 28 May 2006 13:04:16 +0000
branchSDL-1.3
changeset 1662 782fd950bd46
parent 1659 14717b52abc0
child 1668 4da1ee79c9af
permissions -rw-r--r--
Revamp of the video system in progress - adding support for multiple displays, multiple windows, and a full video mode selection API. WARNING: None of the video drivers have been updated for the new API yet! The API is still under design and very fluid. The code is now run through a consistent indent format: indent -i4 -nut -nsc -br -ce The headers are being converted to automatically generate doxygen documentation.


/* Test the thread and mutex locking functions 
   Also exercises the system's signal/thread interaction
*/

#include <signal.h>
#include <stdio.h>

#include "SDL.h"
#include "SDL_mutex.h"
#include "SDL_thread.h"

static SDL_mutex *mutex = NULL;
static Uint32 mainthread;
static SDL_Thread *threads[6];
static volatile int doterminate = 0;

/*
 * SDL_Quit() shouldn't be used with atexit() directly because
 *  calling conventions may differ...
 */
static void
SDL_Quit_Wrapper (void)
{
    SDL_Quit ();
}

void
printid (void)
{
    printf ("Process %u:  exiting\n", SDL_ThreadID ());
}

void
terminate (int sig)
{
    signal (SIGINT, terminate);
    doterminate = 1;
}

void
closemutex (int sig)
{
    Uint32 id = SDL_ThreadID ();
    int i;
    printf ("Process %u:  Cleaning up...\n", id == mainthread ? 0 : id);
    for (i = 0; i < 6; ++i)
        SDL_KillThread (threads[i]);
    SDL_DestroyMutex (mutex);
    exit (sig);
}

int SDLCALL
Run (void *data)
{
    if (SDL_ThreadID () == mainthread)
        signal (SIGTERM, closemutex);
    while (1) {
        printf ("Process %u ready to work\n", SDL_ThreadID ());
        if (SDL_mutexP (mutex) < 0) {
            fprintf (stderr, "Couldn't lock mutex: %s", SDL_GetError ());
            exit (1);
        }
        printf ("Process %u, working!\n", SDL_ThreadID ());
        SDL_Delay (1 * 1000);
        printf ("Process %u, done!\n", SDL_ThreadID ());
        if (SDL_mutexV (mutex) < 0) {
            fprintf (stderr, "Couldn't unlock mutex: %s", SDL_GetError ());
            exit (1);
        }
        /* If this sleep isn't done, then threads may starve */
        SDL_Delay (10);
        if (SDL_ThreadID () == mainthread && doterminate) {
            printf ("Process %u:  raising SIGTERM\n", SDL_ThreadID ());
            raise (SIGTERM);
        }
    }
    return (0);
}

int
main (int argc, char *argv[])
{
    int i;
    int maxproc = 6;

    /* Load the SDL library */
    if (SDL_Init (0) < 0) {
        fprintf (stderr, "%s\n", SDL_GetError ());
        exit (1);
    }
    atexit (SDL_Quit_Wrapper);

    if ((mutex = SDL_CreateMutex ()) == NULL) {
        fprintf (stderr, "Couldn't create mutex: %s\n", SDL_GetError ());
        exit (1);
    }

    mainthread = SDL_ThreadID ();
    printf ("Main thread: %u\n", mainthread);
    atexit (printid);
    for (i = 0; i < maxproc; ++i) {
        if ((threads[i] = SDL_CreateThread (Run, NULL)) == NULL)
            fprintf (stderr, "Couldn't create thread!\n");
    }
    signal (SIGINT, terminate);
    Run (NULL);

    return (0);                 /* Never reached */
}