Mercurial > sdl-ios-xcode
view test/testlock.c @ 1156:8521404a33c7
Date: Tue, 11 Oct 2005 16:58:12 +0300 (EEST)
From: =?ISO-8859-1?Q?Martin_Storsj=F6?= <martin@martin.st>
To: sdl@libsdl.org
Subject: [SDL] [PATCH] Use nanosleep on OS X
Hi,
The current version of SDL_Delay on OS X seems to always sleep at least 10
msec. OS X has nanosleep(), which performs shorter sleeps well. The
attached patch makes it use that one instead of select() as currently.
// Martin
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Tue, 11 Oct 2005 17:33:03 +0000 |
parents | be9c9c8f6d53 |
children | 14717b52abc0 |
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 <stdlib.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]; /* * 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) { printf("Process %u: raising SIGTERM\n", SDL_ThreadID()); raise(SIGTERM); } 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 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); } 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 */ }