Mercurial > sdl-ios-xcode
diff src/timer/SDL_timer.c @ 1895:c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 10 Jul 2006 21:04:37 +0000 |
parents | e02263385643 |
children | 99210400e8b9 |
line wrap: on
line diff
--- a/src/timer/SDL_timer.c Thu Jul 06 18:01:37 2006 +0000 +++ b/src/timer/SDL_timer.c Mon Jul 10 21:04:37 2006 +0000 @@ -38,12 +38,13 @@ /* Data used for a thread-based timer */ static int SDL_timer_threaded = 0; -struct _SDL_TimerID { - Uint32 interval; - SDL_NewTimerCallback cb; - void *param; - Uint32 last_alarm; - struct _SDL_TimerID *next; +struct _SDL_TimerID +{ + Uint32 interval; + SDL_NewTimerCallback cb; + void *param; + Uint32 last_alarm; + struct _SDL_TimerID *next; }; static SDL_TimerID SDL_timers = NULL; @@ -53,233 +54,247 @@ /* Set whether or not the timer should use a thread. This should not be called while the timer subsystem is running. */ -int SDL_SetTimerThreaded(int value) +int +SDL_SetTimerThreaded(int value) { - int retval; + int retval; - if ( SDL_timer_started ) { - SDL_SetError("Timer already initialized"); - retval = -1; - } else { - retval = 0; - SDL_timer_threaded = value; - } - return retval; + if (SDL_timer_started) { + SDL_SetError("Timer already initialized"); + retval = -1; + } else { + retval = 0; + SDL_timer_threaded = value; + } + return retval; } -int SDL_TimerInit(void) +int +SDL_TimerInit(void) { - int retval; + int retval; - retval = 0; - if ( SDL_timer_started ) { - SDL_TimerQuit(); - } - if ( ! SDL_timer_threaded ) { - retval = SDL_SYS_TimerInit(); - } - if ( SDL_timer_threaded ) { - SDL_timer_mutex = SDL_CreateMutex(); - } - if ( retval == 0 ) { - SDL_timer_started = 1; - } - return(retval); + retval = 0; + if (SDL_timer_started) { + SDL_TimerQuit(); + } + if (!SDL_timer_threaded) { + retval = SDL_SYS_TimerInit(); + } + if (SDL_timer_threaded) { + SDL_timer_mutex = SDL_CreateMutex(); + } + if (retval == 0) { + SDL_timer_started = 1; + } + return (retval); } -void SDL_TimerQuit(void) +void +SDL_TimerQuit(void) { - SDL_SetTimer(0, NULL); - if ( SDL_timer_threaded < 2 ) { - SDL_SYS_TimerQuit(); - } - if ( SDL_timer_threaded ) { - SDL_DestroyMutex(SDL_timer_mutex); - SDL_timer_mutex = NULL; - } - SDL_timer_started = 0; - SDL_timer_threaded = 0; + SDL_SetTimer(0, NULL); + if (SDL_timer_threaded < 2) { + SDL_SYS_TimerQuit(); + } + if (SDL_timer_threaded) { + SDL_DestroyMutex(SDL_timer_mutex); + SDL_timer_mutex = NULL; + } + SDL_timer_started = 0; + SDL_timer_threaded = 0; } -void SDL_ThreadedTimerCheck(void) +void +SDL_ThreadedTimerCheck(void) { - Uint32 now, ms; - SDL_TimerID t, prev, next; - SDL_bool removed; + Uint32 now, ms; + SDL_TimerID t, prev, next; + SDL_bool removed; - SDL_mutexP(SDL_timer_mutex); - list_changed = SDL_FALSE; - now = SDL_GetTicks(); - for ( prev = NULL, t = SDL_timers; t; t = next ) { - removed = SDL_FALSE; - ms = t->interval - SDL_TIMESLICE; - next = t->next; - if ( (int)(now - t->last_alarm) > (int)ms ) { - struct _SDL_TimerID timer; + SDL_mutexP(SDL_timer_mutex); + list_changed = SDL_FALSE; + now = SDL_GetTicks(); + for (prev = NULL, t = SDL_timers; t; t = next) { + removed = SDL_FALSE; + ms = t->interval - SDL_TIMESLICE; + next = t->next; + if ((int) (now - t->last_alarm) > (int) ms) { + struct _SDL_TimerID timer; - if ( (now - t->last_alarm) < t->interval ) { - t->last_alarm += t->interval; - } else { - t->last_alarm = now; - } + if ((now - t->last_alarm) < t->interval) { + t->last_alarm += t->interval; + } else { + t->last_alarm = now; + } #ifdef DEBUG_TIMERS - printf("Executing timer %p (thread = %d)\n", - t, SDL_ThreadID()); + printf("Executing timer %p (thread = %d)\n", t, SDL_ThreadID()); #endif - timer = *t; - SDL_mutexV(SDL_timer_mutex); - ms = timer.cb(timer.interval, timer.param); - SDL_mutexP(SDL_timer_mutex); - if ( list_changed ) { - /* Abort, list of timers modified */ - /* FIXME: what if ms was changed? */ - break; - } - if ( ms != t->interval ) { - if ( ms ) { - t->interval = ROUND_RESOLUTION(ms); - } else { - /* Remove timer from the list */ + timer = *t; + SDL_mutexV(SDL_timer_mutex); + ms = timer.cb(timer.interval, timer.param); + SDL_mutexP(SDL_timer_mutex); + if (list_changed) { + /* Abort, list of timers modified */ + /* FIXME: what if ms was changed? */ + break; + } + if (ms != t->interval) { + if (ms) { + t->interval = ROUND_RESOLUTION(ms); + } else { + /* Remove timer from the list */ #ifdef DEBUG_TIMERS - printf("SDL: Removing timer %p\n", t); + printf("SDL: Removing timer %p\n", t); #endif - if ( prev ) { - prev->next = next; - } else { - SDL_timers = next; - } - SDL_free(t); - --SDL_timer_running; - removed = SDL_TRUE; - } - } - } - /* Don't update prev if the timer has disappeared */ - if ( ! removed ) { - prev = t; - } - } - SDL_mutexV(SDL_timer_mutex); + if (prev) { + prev->next = next; + } else { + SDL_timers = next; + } + SDL_free(t); + --SDL_timer_running; + removed = SDL_TRUE; + } + } + } + /* Don't update prev if the timer has disappeared */ + if (!removed) { + prev = t; + } + } + SDL_mutexV(SDL_timer_mutex); } -static SDL_TimerID SDL_AddTimerInternal(Uint32 interval, SDL_NewTimerCallback callback, void *param) +static SDL_TimerID +SDL_AddTimerInternal(Uint32 interval, SDL_NewTimerCallback callback, + void *param) { - SDL_TimerID t; - t = (SDL_TimerID) SDL_malloc(sizeof(struct _SDL_TimerID)); - if ( t ) { - t->interval = ROUND_RESOLUTION(interval); - t->cb = callback; - t->param = param; - t->last_alarm = SDL_GetTicks(); - t->next = SDL_timers; - SDL_timers = t; - ++SDL_timer_running; - list_changed = SDL_TRUE; - } + SDL_TimerID t; + t = (SDL_TimerID) SDL_malloc(sizeof(struct _SDL_TimerID)); + if (t) { + t->interval = ROUND_RESOLUTION(interval); + t->cb = callback; + t->param = param; + t->last_alarm = SDL_GetTicks(); + t->next = SDL_timers; + SDL_timers = t; + ++SDL_timer_running; + list_changed = SDL_TRUE; + } #ifdef DEBUG_TIMERS - printf("SDL_AddTimer(%d) = %08x num_timers = %d\n", interval, (Uint32)t, SDL_timer_running); + printf("SDL_AddTimer(%d) = %08x num_timers = %d\n", interval, (Uint32) t, + SDL_timer_running); #endif - return t; + return t; } -SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback callback, void *param) +SDL_TimerID +SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback callback, void *param) { - SDL_TimerID t; - if ( ! SDL_timer_mutex ) { - if ( SDL_timer_started ) { - SDL_SetError("This platform doesn't support multiple timers"); - } else { - SDL_SetError("You must call SDL_Init(SDL_INIT_TIMER) first"); - } - return NULL; - } - if ( ! SDL_timer_threaded ) { - SDL_SetError("Multiple timers require threaded events!"); - return NULL; - } - SDL_mutexP(SDL_timer_mutex); - t = SDL_AddTimerInternal(interval, callback, param); - SDL_mutexV(SDL_timer_mutex); - return t; + SDL_TimerID t; + if (!SDL_timer_mutex) { + if (SDL_timer_started) { + SDL_SetError("This platform doesn't support multiple timers"); + } else { + SDL_SetError("You must call SDL_Init(SDL_INIT_TIMER) first"); + } + return NULL; + } + if (!SDL_timer_threaded) { + SDL_SetError("Multiple timers require threaded events!"); + return NULL; + } + SDL_mutexP(SDL_timer_mutex); + t = SDL_AddTimerInternal(interval, callback, param); + SDL_mutexV(SDL_timer_mutex); + return t; } -SDL_bool SDL_RemoveTimer(SDL_TimerID id) +SDL_bool +SDL_RemoveTimer(SDL_TimerID id) { - SDL_TimerID t, prev = NULL; - SDL_bool removed; + SDL_TimerID t, prev = NULL; + SDL_bool removed; - removed = SDL_FALSE; - SDL_mutexP(SDL_timer_mutex); - /* Look for id in the linked list of timers */ - for (t = SDL_timers; t; prev=t, t = t->next ) { - if ( t == id ) { - if(prev) { - prev->next = t->next; - } else { - SDL_timers = t->next; - } - SDL_free(t); - --SDL_timer_running; - removed = SDL_TRUE; - list_changed = SDL_TRUE; - break; - } - } + removed = SDL_FALSE; + SDL_mutexP(SDL_timer_mutex); + /* Look for id in the linked list of timers */ + for (t = SDL_timers; t; prev = t, t = t->next) { + if (t == id) { + if (prev) { + prev->next = t->next; + } else { + SDL_timers = t->next; + } + SDL_free(t); + --SDL_timer_running; + removed = SDL_TRUE; + list_changed = SDL_TRUE; + break; + } + } #ifdef DEBUG_TIMERS - printf("SDL_RemoveTimer(%08x) = %d num_timers = %d thread = %d\n", (Uint32)id, removed, SDL_timer_running, SDL_ThreadID()); + printf("SDL_RemoveTimer(%08x) = %d num_timers = %d thread = %d\n", + (Uint32) id, removed, SDL_timer_running, SDL_ThreadID()); #endif - SDL_mutexV(SDL_timer_mutex); - return removed; + SDL_mutexV(SDL_timer_mutex); + return removed; } /* Old style callback functions are wrapped through this */ -static Uint32 SDLCALL callback_wrapper(Uint32 ms, void *param) +static Uint32 SDLCALL +callback_wrapper(Uint32 ms, void *param) { - SDL_TimerCallback func = (SDL_TimerCallback) param; - return (*func)(ms); + SDL_TimerCallback func = (SDL_TimerCallback) param; + return (*func) (ms); } -int SDL_SetTimer(Uint32 ms, SDL_TimerCallback callback) +int +SDL_SetTimer(Uint32 ms, SDL_TimerCallback callback) { - int retval; + int retval; #ifdef DEBUG_TIMERS - printf("SDL_SetTimer(%d)\n", ms); + printf("SDL_SetTimer(%d)\n", ms); #endif - retval = 0; + retval = 0; - if ( SDL_timer_threaded ) { - SDL_mutexP(SDL_timer_mutex); - } - if ( SDL_timer_running ) { /* Stop any currently running timer */ - if ( SDL_timer_threaded ) { - while ( SDL_timers ) { - SDL_TimerID freeme = SDL_timers; - SDL_timers = SDL_timers->next; - SDL_free(freeme); - } - SDL_timer_running = 0; - list_changed = SDL_TRUE; - } else { - SDL_SYS_StopTimer(); - SDL_timer_running = 0; - } - } - if ( ms ) { - if ( SDL_timer_threaded ) { - if ( SDL_AddTimerInternal(ms, callback_wrapper, (void *)callback) == NULL ) { - retval = -1; - } - } else { - SDL_timer_running = 1; - SDL_alarm_interval = ms; - SDL_alarm_callback = callback; - retval = SDL_SYS_StartTimer(); - } - } - if ( SDL_timer_threaded ) { - SDL_mutexV(SDL_timer_mutex); - } + if (SDL_timer_threaded) { + SDL_mutexP(SDL_timer_mutex); + } + if (SDL_timer_running) { /* Stop any currently running timer */ + if (SDL_timer_threaded) { + while (SDL_timers) { + SDL_TimerID freeme = SDL_timers; + SDL_timers = SDL_timers->next; + SDL_free(freeme); + } + SDL_timer_running = 0; + list_changed = SDL_TRUE; + } else { + SDL_SYS_StopTimer(); + SDL_timer_running = 0; + } + } + if (ms) { + if (SDL_timer_threaded) { + if (SDL_AddTimerInternal + (ms, callback_wrapper, (void *) callback) == NULL) { + retval = -1; + } + } else { + SDL_timer_running = 1; + SDL_alarm_interval = ms; + SDL_alarm_callback = callback; + retval = SDL_SYS_StartTimer(); + } + } + if (SDL_timer_threaded) { + SDL_mutexV(SDL_timer_mutex); + } - return retval; + return retval; } + +/* vi: set ts=4 sw=4 expandtab: */