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