diff --git a/src/odoors/ODPlat.c b/src/odoors/ODPlat.c index e618f5a367cef52bc36fd8cd35b4cdbb4dcd92c0..489426816f0f5f44c66b1421eb6215b3ccda3cb9 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))