Mercurial > sdl-ios-xcode
diff src/timer/mint/SDL_systimer.c @ 2116:b42abf0a50bc
Avoid switch to supervisor mode in SDL_GetTicks, by updating system counter from vbl interrupt
author | Patrice Mandin <patmandin@gmail.com> |
---|---|
date | Sat, 09 Jun 2007 19:58:41 +0000 |
parents | 502ae1f2a577 |
children | 2c835d58faad |
line wrap: on
line diff
--- a/src/timer/mint/SDL_systimer.c Fri Jun 08 21:44:55 2007 +0000 +++ b/src/timer/mint/SDL_systimer.c Sat Jun 09 19:58:41 2007 +0000 @@ -53,7 +53,7 @@ /* The first ticks value of the application */ static Uint32 start; -static volatile SDL_bool supervisor; +static SDL_bool read_hz200_from_vbl = SDL_FALSE; static int mint_present; /* can we use Syield() ? */ void @@ -75,21 +75,14 @@ Uint32 SDL_GetTicks(void) { - Uint32 now; - void *oldpile = NULL; + Uint32 now = start; - /* Check if we are in supervisor mode - (this is the case when called from SDL_ThreadedTimerCheck, - which is called from RunTimer, running in the vbl vector) - */ - if (!supervisor) { - oldpile = (void *) Super(0); - } - - now = *((volatile long *) _hz_200); - - if (!supervisor) { - Super(oldpile); + if (read_hz200_from_vbl) { + now = SDL_Atari_hz200; + } else { + void *old_stack = (void *)Super(0); + now = *((volatile long *)_hz_200); + Super(old_stack); } return ((now * 5) - start); @@ -111,47 +104,38 @@ /* Data to handle a single periodic alarm */ static SDL_bool timer_installed = SDL_FALSE; -static void -RunTimer(void) -{ - supervisor = SDL_TRUE; - SDL_ThreadedTimerCheck(); - supervisor = SDL_FALSE; -} - /* This is only called if the event thread is not running */ int SDL_SYS_TimerInit(void) { - void *oldpile; - - supervisor = SDL_FALSE; + void *old_stack; SDL_MintAudio_CheckFpu(); /* Install RunTimer in vbl vector */ - oldpile = (void *) Super(0); - timer_installed = !SDL_AtariVblInstall(RunTimer); - Super(oldpile); + old_stack = (void *) Super(0); + timer_installed = !SDL_AtariVblInstall(SDL_ThreadedTimerCheck); + Super(old_stack); if (!timer_installed) { return (-1); } + + read_hz200_from_vbl = SDL_TRUE; return (SDL_SetTimerThreaded(0)); } void SDL_SYS_TimerQuit(void) { - void *oldpile; - if (timer_installed) { /* Uninstall RunTimer vbl vector */ - oldpile = (void *) Super(0); + void *old_stack = (void *) Super(0); SDL_AtariVblUninstall(RunTimer); - Super(oldpile); + Super(old_stack); timer_installed = SDL_FALSE; } + read_hz200_from_vbl = SDL_FALSE; } int