From 6fb3dccfb15bd5a1aba273900ae8256c59c62bdc Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Tue, 18 May 2004 10:34:55 +0000
Subject: [PATCH] Fix od_sleep() for *nix

---
 src/odoors/ODPlat.c | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/src/odoors/ODPlat.c b/src/odoors/ODPlat.c
index e618f5a367..489426816f 100644
--- a/src/odoors/ODPlat.c
+++ b/src/odoors/ODPlat.c
@@ -781,6 +781,8 @@ ODAPIDEF void ODCALL od_sleep(tODMilliSec Milliseconds)
 #ifdef ODPLAT_NIX
    struct timeval tv;
    struct timeval start;
+   long long started;
+   long long left
 #endif
    /* Log function entry if running in trace mode. */
    TRACE(TRACE_API, "od_sleep()");
@@ -820,19 +822,16 @@ ODAPIDEF void ODCALL od_sleep(tODMilliSec Milliseconds)
    }
    else  {
       gettimeofday(&start,NULL);
-	  start.tv_sec += Milliseconds/1000;
-	  start.tv_usec += (Milliseconds*1000)%1000000;
-
+	  started=start.tv_sec*1000+(start.tv_usec/1000);
 
       while(1)  {
 	     /* This is timing sensitive and *MUST* wait for at least Milliseconds regardless of 100% CPU or signals */
          gettimeofday(&tv,NULL);
-         tv.tv_sec -= (start.tv_sec + Milliseconds/1000);
-         tv.tv_usec -= (start.tv_usec + ((Milliseconds*1000)%1000000));
-         if(tv.tv_usec < 0) {
-            tv.tv_sec--;
-            tv.tv_usec += 1000000;
-         }
+		 left=tv.tv_sec*1000+(tv.tv_usec/1000);
+		 left-=started;
+		 left=Milliseconds-left;
+         tv.tv_sec = left/1000;
+         tv.tv_usec = (left*1000)%1000000;
          if(tv.tv_sec<0 || tv.tv_usec<0)
             break;
          if(!select(0,NULL,NULL,NULL,&tv))
-- 
GitLab