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:
Marty Kraimer
2002-06-14 14:55:43 +00:00
parent 7799184457
commit eeee6c51d1
4 changed files with 34 additions and 52 deletions

View File

@@ -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);
}

View File

@@ -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)) {

View File

@@ -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);
}

View File

@@ -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 */