From eeee6c51d1ef15037162b41dbb102c32da4b7ce9 Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Fri, 14 Jun 2002 14:55:43 +0000 Subject: [PATCH] Put convertDoubleToWakeTime in osdTime.cpp so that it is not duplicated. Use clock_gettime in convertDoubleToWakeTime. Always use clock_gettime get current time --- src/libCom/osi/os/posix/osdEvent.c | 23 +++------------------ src/libCom/osi/os/posix/osdMutex.c | 23 +++------------------ src/libCom/osi/os/posix/osdTime.cpp | 32 ++++++++++++++++++----------- src/libCom/osi/os/posix/osdTime.h | 8 ++++++++ 4 files changed, 34 insertions(+), 52 deletions(-) diff --git a/src/libCom/osi/os/posix/osdEvent.c b/src/libCom/osi/os/posix/osdEvent.c index 5aeccefa6..f5591cedb 100644 --- a/src/libCom/osi/os/posix/osdEvent.c +++ b/src/libCom/osi/os/posix/osdEvent.c @@ -42,25 +42,6 @@ if(status) { \ errlogPrintf("%s failed: error %s\n",(message),strerror((status))); \ cantProceed((method)); \ } - -static void convertDoubleToWakeTime(double timeout,struct timespec *wakeTime) -{ - struct timespec wait; - epicsTimeStamp stamp; - - if(timeout<0.0) timeout = 0.0; - else if(timeout>3600.0) timeout = 3600.0; - epicsTimeGetCurrent(&stamp); - epicsTimeToTimespec(wakeTime, &stamp); - wait.tv_sec = timeout; - wait.tv_nsec = (long)((timeout - (double)wait.tv_sec) * 1e9); - wakeTime->tv_sec += wait.tv_sec; - wakeTime->tv_nsec += wait.tv_nsec; - if(wakeTime->tv_nsec>1000000000L) { - wakeTime->tv_nsec -= 1000000000L; - ++wakeTime->tv_sec; - } -} epicsEventId epicsEventCreate(epicsEventInitialState initialState) { @@ -136,7 +117,9 @@ epicsEventWaitStatus epicsEventWaitWithTimeout(epicsEventId pevent, double timeo status = pthread_mutex_lock(&pevent->mutex); checkStatusQuit(status,"pthread_mutex_lock","epicsEventWaitWithTimeout"); if(!pevent->isFull) { - convertDoubleToWakeTime(timeout,&wakeTime); + status = convertDoubleToWakeTime(timeout,&wakeTime); + checkStatusQuit(unlockStatus,"convertDoubleToWakeTime", + "epicsEventWaitWithTimeout"); status = pthread_cond_timedwait( &pevent->cond,&pevent->mutex,&wakeTime); } diff --git a/src/libCom/osi/os/posix/osdMutex.c b/src/libCom/osi/os/posix/osdMutex.c index 2db25e93e..d2ad379fd 100644 --- a/src/libCom/osi/os/posix/osdMutex.c +++ b/src/libCom/osi/os/posix/osdMutex.c @@ -48,25 +48,6 @@ if(status) { \ errlogPrintf("%s failed: error %s\n",(message),strerror((status))); \ cantProceed((method)); \ } - -static void convertDoubleToWakeTime(double timeout,struct timespec *wakeTime) -{ - struct timespec wait; - epicsTimeStamp stamp; - - if(timeout<0.0) timeout = 0.0; - else if(timeout>3600.0) timeout = 3600.0; - epicsTimeGetCurrent(&stamp); - epicsTimeToTimespec(wakeTime, &stamp); - wait.tv_sec = timeout; - wait.tv_nsec = (long)((timeout - (double)wait.tv_sec) * 1e9); - wakeTime->tv_sec += wait.tv_sec; - wakeTime->tv_nsec += wait.tv_nsec; - if(wakeTime->tv_nsec>1000000000L) { - wakeTime->tv_nsec -= 1000000000L; - ++wakeTime->tv_sec; - } -} epicsMutexId epicsMutexOsdCreate(void) { epicsMutexOSD *pmutex; @@ -158,7 +139,9 @@ epicsMutexLockStatus epicsMutexLockWithTimeout(epicsMutexId pmutex, double timeo struct timespec wakeTime; int status,unlockStatus; - convertDoubleToWakeTime(timeout,&wakeTime); + status = convertDoubleToWakeTime(timeout,&wakeTime); + checkStatusQuit(status,"convertDoubleToWakeTime", + "epicsMutexLockWithTimeout"); status = pthread_mutex_lock(&pmutex->lock); checkStatusQuit(status,"pthread_mutex_lock","epicsMutexLockWithTimeout"); while(pmutex->owned && !pthread_equal(pmutex->ownerTid,tid)) { diff --git a/src/libCom/osi/os/posix/osdTime.cpp b/src/libCom/osi/os/posix/osdTime.cpp index c8ee473bd..418361287 100644 --- a/src/libCom/osi/os/posix/osdTime.cpp +++ b/src/libCom/osi/os/posix/osdTime.cpp @@ -14,7 +14,6 @@ // extern "C" epicsShareFunc int epicsShareAPI epicsTimeGetCurrent (epicsTimeStamp *pDest) { -# ifdef _POSIX_TIMERS struct timespec ts; int status; @@ -25,17 +24,6 @@ extern "C" epicsShareFunc int epicsShareAPI epicsTimeGetCurrent (epicsTimeStamp *pDest = epicsTime (ts); return epicsTimeOK; -# else - int status; - struct timeval tv; - - status = gettimeofday (&tv, NULL); - if (status) { - return epicsTimeERROR; - } - *pDest = epicsTime (tv); - return epicsTimeOK; -# endif } // @@ -73,3 +61,23 @@ int epicsTime_localtime ( const time_t *clock, // X aCC 361 } } +extern "C" epicsShareFunc int epicsShareAPI + convertDoubleToWakeTime(double timeout,struct timespec *wakeTime) +{ + struct timespec wait; + int status; + + if(timeout<0.0) timeout = 0.0; + else if(timeout>3600.0) timeout = 3600.0; + status = clock_gettime(CLOCK_REALTIME,wakeTime); + if(status) return epicsTimeERROR; + wait.tv_sec = timeout; + wait.tv_nsec = (long)((timeout - (double)wait.tv_sec) * 1e9); + wakeTime->tv_sec += wait.tv_sec; + wakeTime->tv_nsec += wait.tv_nsec; + if(wakeTime->tv_nsec>1000000000L) { + wakeTime->tv_nsec -= 1000000000L; + ++wakeTime->tv_sec; + } + return(0); +} diff --git a/src/libCom/osi/os/posix/osdTime.h b/src/libCom/osi/os/posix/osdTime.h index 319652fd9..3bcb9479a 100644 --- a/src/libCom/osi/os/posix/osdTime.h +++ b/src/libCom/osi/os/posix/osdTime.h @@ -16,6 +16,14 @@ long tv_nsec; /* nanoseconds within the second */ }; #endif /* ifndef _POSIX_TIMERS */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ +epicsShareFunc int epicsShareAPI + convertDoubleToWakeTime(double timeout,struct timespec *wakeTime); +#ifdef __cplusplus +} +#endif /* __cplusplus */ #endif /* ifndef osdTimeh */