diff src/timer/os2/SDL_systimer.c @ 1662:782fd950bd46 SDL-1.3

Revamp of the video system in progress - adding support for multiple displays, multiple windows, and a full video mode selection API. WARNING: None of the video drivers have been updated for the new API yet! The API is still under design and very fluid. The code is now run through a consistent indent format: indent -i4 -nut -nsc -br -ce The headers are being converted to automatically generate doxygen documentation.
author Sam Lantinga <slouken@libsdl.org>
date Sun, 28 May 2006 13:04:16 +0000
parents 92947e3a18db
children 4da1ee79c9af
line wrap: on
line diff
--- a/src/timer/os2/SDL_systimer.c	Sun May 21 17:27:13 2006 +0000
+++ b/src/timer/os2/SDL_systimer.c	Sun May 28 13:04:16 2006 +0000
@@ -44,184 +44,187 @@
 /* The number of ticks per second of the high-resolution performance counter */
 static ULONG hires_ticks_per_second;
 
-void SDL_StartTicks(void)
+void
+SDL_StartTicks (void)
 {
-        DosTmrQueryFreq(&hires_ticks_per_second);
-        DosTmrQueryTime((PQWORD)&hires_start_ticks);
+    DosTmrQueryFreq (&hires_ticks_per_second);
+    DosTmrQueryTime ((PQWORD) & hires_start_ticks);
 }
 
-DECLSPEC Uint32 SDLCALL SDL_GetTicks(void)
+DECLSPEC Uint32 SDLCALL
+SDL_GetTicks (void)
 {
-        long long hires_now;
-        ULONG ticks = ticks;
+    long long hires_now;
+    ULONG ticks = ticks;
 
-        DosTmrQueryTime((PQWORD)&hires_now);
+    DosTmrQueryTime ((PQWORD) & hires_now);
 /*
         hires_now -= hires_start_ticks;
         hires_now *= 1000;
         hires_now /= hires_ticks_per_second;
 */
-        /* inline asm to avoid runtime inclusion */
-        _asm {
-           push edx
-           push eax
-           mov eax, dword ptr hires_now
-           mov edx, dword ptr hires_now+4
-           sub eax, dword ptr hires_start_ticks
-           sbb edx, dword ptr hires_start_ticks+4
-           mov ebx,1000
-           mov ecx,edx
-           mul ebx
-           push eax
-           push edx
-           mov eax,ecx
-           mul ebx
-           pop eax
-           add edx,eax
-           pop eax
-           mov ebx, dword ptr hires_ticks_per_second
-           div ebx
-           mov dword ptr ticks, eax
-           pop edx
-           pop eax
-        }
+    /* inline asm to avoid runtime inclusion */
+    _asm {
+    push edx
+            push eax
+            mov eax, dword ptr hires_now
+            mov edx, dword ptr hires_now + 4
+            sub eax, dword ptr hires_start_ticks
+            sbb edx, dword ptr hires_start_ticks + 4
+            mov ebx, 1000
+            mov ecx, edx
+            mul ebx
+            push eax
+            push edx
+            mov eax, ecx
+            mul ebx
+            pop eax
+            add edx, eax
+            pop eax
+            mov ebx, dword ptr hires_ticks_per_second
+            div ebx mov dword ptr ticks, eax pop edx pop eax}
 
-        return ticks;
+    return ticks;
 
 }
 
 /* High resolution sleep, originally made by Ilya Zakharevich */
-DECLSPEC void SDLCALL SDL_Delay(Uint32 ms)
+DECLSPEC void SDLCALL
+SDL_Delay (Uint32 ms)
 {
-  /* This is similar to DosSleep(), but has 8ms granularity in time-critical
-     threads even on Warp3. */
-  HEV     hevEvent1     = 0;   /* Event semaphore handle    */
-  HTIMER  htimerEvent1  = 0;   /* Timer handle              */
-  APIRET  rc            = NO_ERROR;  /* Return code               */
-  int ret = 1;
-  ULONG priority = 0, nesting;   /* Shut down the warnings */
-  PPIB pib;
-  PTIB tib;
-  char *e = NULL;
-  APIRET badrc;
-  int switch_priority = 50;
+    /* This is similar to DosSleep(), but has 8ms granularity in time-critical
+       threads even on Warp3. */
+    HEV hevEvent1 = 0;          /* Event semaphore handle    */
+    HTIMER htimerEvent1 = 0;    /* Timer handle              */
+    APIRET rc = NO_ERROR;       /* Return code               */
+    int ret = 1;
+    ULONG priority = 0, nesting;        /* Shut down the warnings */
+    PPIB pib;
+    PTIB tib;
+    char *e = NULL;
+    APIRET badrc;
+    int switch_priority = 50;
 
-  DosCreateEventSem(NULL,      /* Unnamed */
-                    &hevEvent1,  /* Handle of semaphore returned */
-                    DC_SEM_SHARED, /* Shared needed for DosAsyncTimer */
-                    FALSE);      /* Semaphore is in RESET state  */
+    DosCreateEventSem (NULL,    /* Unnamed */
+                       &hevEvent1,      /* Handle of semaphore returned */
+                       DC_SEM_SHARED,   /* Shared needed for DosAsyncTimer */
+                       FALSE);  /* Semaphore is in RESET state  */
 
-  if (ms >= switch_priority)
-    switch_priority = 0;
-  if (switch_priority)
-  {
-    if (DosGetInfoBlocks(&tib, &pib)!=NO_ERROR)
-      switch_priority = 0;
-    else
-    {
- /* In Warp3, to switch scheduling to 8ms step, one needs to do 
-    DosAsyncTimer() in time-critical thread.  On laters versions,
-    more and more cases of wait-for-something are covered.
-
-    It turns out that on Warp3fp42 it is the priority at the time
-    of DosAsyncTimer() which matters.  Let's hope that this works
-    with later versions too...  XXXX
-  */
-      priority = (tib->tib_ptib2->tib2_ulpri);
-      if ((priority & 0xFF00) == 0x0300) /* already time-critical */
+    if (ms >= switch_priority)
         switch_priority = 0;
- /* Make us time-critical.  Just modifying TIB is not enough... */
- /* tib->tib_ptib2->tib2_ulpri = 0x0300;*/
- /* We do not want to run at high priority if a signal causes us
-    to longjmp() out of this section... */
-      if (DosEnterMustComplete(&nesting))
-        switch_priority = 0;
-      else
-        DosSetPriority(PRTYS_THREAD, PRTYC_TIMECRITICAL, 0, 0);
+    if (switch_priority) {
+        if (DosGetInfoBlocks (&tib, &pib) != NO_ERROR)
+            switch_priority = 0;
+        else {
+            /* In Warp3, to switch scheduling to 8ms step, one needs to do 
+               DosAsyncTimer() in time-critical thread.  On laters versions,
+               more and more cases of wait-for-something are covered.
+
+               It turns out that on Warp3fp42 it is the priority at the time
+               of DosAsyncTimer() which matters.  Let's hope that this works
+               with later versions too...  XXXX
+             */
+            priority = (tib->tib_ptib2->tib2_ulpri);
+            if ((priority & 0xFF00) == 0x0300)  /* already time-critical */
+                switch_priority = 0;
+            /* Make us time-critical.  Just modifying TIB is not enough... */
+            /* tib->tib_ptib2->tib2_ulpri = 0x0300; */
+            /* We do not want to run at high priority if a signal causes us
+               to longjmp() out of this section... */
+            if (DosEnterMustComplete (&nesting))
+                switch_priority = 0;
+            else
+                DosSetPriority (PRTYS_THREAD, PRTYC_TIMECRITICAL, 0, 0);
+        }
     }
-  }
 
-  if ((badrc = DosAsyncTimer(ms,
-        (HSEM) hevEvent1, /* Semaphore to post        */
-        &htimerEvent1))) /* Timer handler (returned) */
-    e = "DosAsyncTimer";
+    if ((badrc = DosAsyncTimer (ms, (HSEM) hevEvent1,   /* Semaphore to post        */
+                                &htimerEvent1)))        /* Timer handler (returned) */
+        e = "DosAsyncTimer";
 
-  if (switch_priority && tib->tib_ptib2->tib2_ulpri == 0x0300)
-  {
- /* Nobody switched priority while we slept...  Ignore errors... */
- /* tib->tib_ptib2->tib2_ulpri = priority; */ /* Get back... */
-    if (!(rc = DosSetPriority(PRTYS_THREAD, (priority>>8) & 0xFF, 0, 0)))
-      rc = DosSetPriority(PRTYS_THREAD, 0, priority & 0xFF, 0);
-  }
-  if (switch_priority)
-    rc = DosExitMustComplete(&nesting); /* Ignore errors */
+    if (switch_priority && tib->tib_ptib2->tib2_ulpri == 0x0300) {
+        /* Nobody switched priority while we slept...  Ignore errors... */
+        /* tib->tib_ptib2->tib2_ulpri = priority; *//* Get back... */
+        if (!
+            (rc =
+             DosSetPriority (PRTYS_THREAD, (priority >> 8) & 0xFF, 0, 0)))
+            rc = DosSetPriority (PRTYS_THREAD, 0, priority & 0xFF, 0);
+    }
+    if (switch_priority)
+        rc = DosExitMustComplete (&nesting);    /* Ignore errors */
 
-  /* The actual blocking call is made with "normal" priority.  This way we
-     should not bother with DosSleep(0) etc. to compensate for us interrupting
-     higher-priority threads.  The goal is to prohibit the system spending too
-     much time halt()ing, not to run us "no matter what". */
-  if (!e)     /* Wait for AsyncTimer event */
-    badrc = DosWaitEventSem(hevEvent1, SEM_INDEFINITE_WAIT);
+    /* The actual blocking call is made with "normal" priority.  This way we
+       should not bother with DosSleep(0) etc. to compensate for us interrupting
+       higher-priority threads.  The goal is to prohibit the system spending too
+       much time halt()ing, not to run us "no matter what". */
+    if (!e)                     /* Wait for AsyncTimer event */
+        badrc = DosWaitEventSem (hevEvent1, SEM_INDEFINITE_WAIT);
 
-  if (e) ;    /* Do nothing */
-  else if (badrc == ERROR_INTERRUPT)
-    ret = 0;
-  else if (badrc)
-    e = "DosWaitEventSem";
-  if ((rc = DosCloseEventSem(hevEvent1)) && !e) { /* Get rid of semaphore */
-    e = "DosCloseEventSem";
-    badrc = rc;
-  }
-  if (e)
-  {
-    SDL_SetError("[SDL_Delay] : Had error in %s(), rc is 0x%x\n", e, badrc);
-  }
+    if (e);                     /* Do nothing */
+    else if (badrc == ERROR_INTERRUPT)
+        ret = 0;
+    else if (badrc)
+        e = "DosWaitEventSem";
+    if ((rc = DosCloseEventSem (hevEvent1)) && !e) {    /* Get rid of semaphore */
+        e = "DosCloseEventSem";
+        badrc = rc;
+    }
+    if (e) {
+        SDL_SetError ("[SDL_Delay] : Had error in %s(), rc is 0x%x\n", e,
+                      badrc);
+    }
 }
 
 /* Data to handle a single periodic alarm */
 static int timer_alive = 0;
 static SDL_Thread *timer = NULL;
 
-static int RunTimer(void *unused)
+static int
+RunTimer (void *unused)
 {
-        DosSetPriority(PRTYS_THREAD, PRTYC_TIMECRITICAL, 0, 0);
-        while ( timer_alive ) {
-                if ( SDL_timer_running ) {
-                        SDL_ThreadedTimerCheck();
-                }
-                SDL_Delay(10);
+    DosSetPriority (PRTYS_THREAD, PRTYC_TIMECRITICAL, 0, 0);
+    while (timer_alive) {
+        if (SDL_timer_running) {
+            SDL_ThreadedTimerCheck ();
         }
-        return(0);
+        SDL_Delay (10);
+    }
+    return (0);
 }
 
 /* This is only called if the event thread is not running */
-int SDL_SYS_TimerInit(void)
+int
+SDL_SYS_TimerInit (void)
 {
-        timer_alive = 1;
-        timer = SDL_CreateThread(RunTimer, NULL);
-        if ( timer == NULL )
-                return(-1);
-        return(SDL_SetTimerThreaded(1));
+    timer_alive = 1;
+    timer = SDL_CreateThread (RunTimer, NULL);
+    if (timer == NULL)
+        return (-1);
+    return (SDL_SetTimerThreaded (1));
 }
 
-void SDL_SYS_TimerQuit(void)
+void
+SDL_SYS_TimerQuit (void)
 {
-        timer_alive = 0;
-        if ( timer ) {
-                SDL_WaitThread(timer, NULL);
-                timer = NULL;
-        }
+    timer_alive = 0;
+    if (timer) {
+        SDL_WaitThread (timer, NULL);
+        timer = NULL;
+    }
 }
 
-int SDL_SYS_StartTimer(void)
+int
+SDL_SYS_StartTimer (void)
 {
-        SDL_SetError("Internal logic error: OS/2 uses threaded timer");
-        return(-1);
+    SDL_SetError ("Internal logic error: OS/2 uses threaded timer");
+    return (-1);
 }
 
-void SDL_SYS_StopTimer(void)
+void
+SDL_SYS_StopTimer (void)
 {
-        return;
+    return;
 }
 
 #endif /* SDL_TIMER_OS2 */
+/* vi: set ts=4 sw=4 expandtab: */