view test/testlock.c @ 2364:e321b52dee8f gsoc2008_iphone

These files contain the audio support for iPhone. They are based on the CoreAudio audio driver for Mac OS X. The principle difference is that the iPhone doesn't seem to have a concept of audio devices ... it just has special units for audio in and audio out. Also had to change some functions to versions which seem to only exist on iPhone and will apparently exist in Mac OS X 10.6(!) There is currently no audio recording support -- my iPod Touch doesn't have a microphone to test this with.
author Holmes Futrell <hfutrell@umail.ucsb.edu>
date Fri, 18 Jul 2008 17:53:54 +0000
parents c121d94672cb
children 4436464c4f51
line wrap: on
line source


/* 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 */
}