diff --git a/src/odoors/ODPlat.c b/src/odoors/ODPlat.c index 489426816f0f5f44c66b1421eb6215b3ccda3cb9..0279e8dd2344e51b0bd102200249119a98569753 100644 --- a/src/odoors/ODPlat.c +++ b/src/odoors/ODPlat.c @@ -579,8 +579,7 @@ void ODTimerStart(tODTimer *pTimer, tODMilliSec Duration) #ifdef ODPLAT_NIX gettimeofday(&tv,NULL); - pTimer->Start_sec=tv.tv_sec; - pTimer->Start_usec=tv.tv_usec; + pTimer->Start=(long long)tv.tv_sec*1000+tv.tv_usec/1000; pTimer->Duration = Duration; #endif } @@ -654,19 +653,7 @@ void ODTimerWaitForElapse(tODTimer *pTimer) #elif defined(ODPLAT_NIX) /* This is timing sensitive and *MUST* wait regardless of 100% CPU or signals */ - while(1) { - gettimeofday(&tv,NULL); - 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; - } - if(tv.tv_sec<0 || tv.tv_usec<0) - return; - if(!select(0,NULL,NULL,NULL,&tv)) - break; - } + od_sleep(ODTimerLeft(pTimer)); #else /* !ODPLAT_DOS */ { /* Under other platforms, timer resolution is high enough that we can */ @@ -731,13 +718,7 @@ tODMilliSec ODTimerLeft(tODTimer *pTimer) } #elif defined(ODPLAT_NIX) gettimeofday(&tv,NULL); - tv.tv_sec -= pTimer->Start_sec; - tv.tv_usec -= pTimer->Start_usec; - if(tv.tv_usec < 0) { - tv.tv_sec--; - tv.tv_usec += 1000000; - } - left=(tv.tv_usec/1000)+(tv.tv_sec*1000); + left=(long long)tv.tv_sec*1000+tv.tv_usec/1000-pTimer->Start; if(left<0) left=0; return(left); diff --git a/src/odoors/ODPlat.h b/src/odoors/ODPlat.h index b7f894ddcb8e272ab7d5e884b2cb3ea400939445..ccd7eb1a771a64a441bb4055b3a87604d08ee8eb 100644 --- a/src/odoors/ODPlat.h +++ b/src/odoors/ODPlat.h @@ -72,8 +72,7 @@ typedef struct clock_t Start; clock_t Duration; #elif defined(ODPLAT_NIX) - long Start_sec; - long Start_usec; + long long Start; tODMilliSec Duration; #else /* !ODPLAT_DOS */ tODMilliSec Start;