Put convertDoubleToWakeTime in osdTime.cpp so that it is not duplicated.
Use clock_gettime in convertDoubleToWakeTime. Always use clock_gettime get current time
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user