From 841151a1ca5d93e72ac65819bc6e136d63a40a49 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Wed, 13 Aug 2003 22:27:23 +0000
Subject: [PATCH] Fix idiotic bug in ODTimerElapsed() which could result in a
 hung process

---
 src/odoors/ODPlat.c | 27 ++++++++++++++-------------
 1 file changed, 14 insertions(+), 13 deletions(-)

diff --git a/src/odoors/ODPlat.c b/src/odoors/ODPlat.c
index b9a76cc2a0..f4ce3a1239 100644
--- a/src/odoors/ODPlat.c
+++ b/src/odoors/ODPlat.c
@@ -578,7 +578,9 @@ void ODTimerStart(tODTimer *pTimer, tODMilliSec Duration)
 #endif /* ODPLAT_WIN32 */
 
 #ifdef ODPLAT_NIX
-   gettimeofday(&(pTimer->Start),NULL);
+   gettimeofday(&tv,NULL);
+   pTimer->Start_sec=tv.tv_sec;
+   pTimer->Start_usec=tv.tv_usec;
    pTimer->Duration = Duration;
 #endif
 }
@@ -600,6 +602,7 @@ BOOL ODTimerElapsed(tODTimer *pTimer)
    struct timeval tv;
    struct timeval end;
 #endif
+
    ASSERT(pTimer != NULL);
 
 #ifdef ODPLAT_DOS
@@ -613,13 +616,7 @@ BOOL ODTimerElapsed(tODTimer *pTimer)
 #endif /* ODPLAT_WIN32 */
 
 #ifdef ODPLAT_NIX
-   /* Don't bother checking for RunKernelTimer */
-   if (pTimer==&RunKernelTimer)
-      return;
-   end.tv_sec=pTimer->Start.tv_sec+(pTimer->Duration / 1000);
-   end.tv_usec=((pTimer->Start.tv_usec)+((pTimer->Duration)*1000))%1000000;
-   gettimeofday(&tv,NULL);
-   return((end.tv_sec >= tv.tv_sec) && (end.tv_usec >= tv.tv_usec));
+	return(ODTimerLeft(pTimer)==0);
 #endif
 }
 
@@ -659,8 +656,8 @@ void ODTimerWaitForElapse(tODTimer *pTimer)
    /* This is timing sensitive and *MUST* wait regardless of 100% CPU or signals */
    while(1)  {
       gettimeofday(&tv,NULL);
-      tv.tv_sec -= (pTimer->Start.tv_sec + pTimer->Duration/1000);
-      tv.tv_usec -= (pTimer->Start.tv_usec + ((pTimer->Duration*1000)%1000000));
+      tv.tv_sec -= (pTimer->Start_sec + pTimer->Duration/1000);
+      tv.tv_usec -= (pTimer->Start_usec + ((pTimer->Duration*1000)%1000000));
       if(tv.tv_usec < 0) {
          tv.tv_sec--;
          tv.tv_usec += 1000000;
@@ -712,6 +709,7 @@ tODMilliSec ODTimerLeft(tODTimer *pTimer)
 {
 #ifdef ODPLAT_NIX
    struct timeval tv;
+   tODMilliSec left=0;
 #endif
    ASSERT(pTimer != NULL);
 
@@ -733,13 +731,16 @@ tODMilliSec ODTimerLeft(tODTimer *pTimer)
    }
 #elif defined(ODPLAT_NIX)
    gettimeofday(&tv,NULL);
-   tv.tv_sec -= pTimer->Start.tv_sec;
-   tv.tv_usec -= pTimer->Start.tv_usec;
+   tv.tv_sec -= pTimer->Start_sec;
+   tv.tv_usec -= pTimer->Start_usec;
    if(tv.tv_usec < 0) {
       tv.tv_sec--;
 	  tv.tv_usec += 1000000;
    }
-   return((tv.tv_usec/1000)+(tv.tv_sec*1000));
+   left=(tv.tv_usec/1000)+(tv.tv_sec*1000);
+   if(left<0)
+      left=0;
+   return(left);
 #else /* !ODPLAT_DOS */
    {
       tODMilliSec Now;
-- 
GitLab