Fix timeout values in epicsEventWaitWithTimeout()
isnan(timeOut) => wait forever 0 < timeOut < 1/rate => 1 tick
This commit is contained in:
@@ -42,12 +42,17 @@ epicsEventStatus epicsEventWaitWithTimeout(epicsEventId id, double timeOut)
|
||||
|
||||
if (timeOut <= 0.0) {
|
||||
ticks = 0;
|
||||
} else if (timeOut >= (double) INT_MAX / rate) {
|
||||
ticks = WAIT_FOREVER;
|
||||
} else {
|
||||
}
|
||||
else if (timeOut < (double) INT_MAX / rate) {
|
||||
ticks = timeOut * rate;
|
||||
if (ticks <= 0)
|
||||
if (ticks == 0) {
|
||||
/* 0 < timeOut < 1/rate; round up */
|
||||
ticks = 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* timeOut is NaN or too big to represent in ticks */
|
||||
ticks = WAIT_FOREVER;
|
||||
}
|
||||
status = semTake((SEM_ID)id, ticks);
|
||||
if (status == OK)
|
||||
|
||||
@@ -21,18 +21,28 @@ extern "C" int sysClkRateGet(void);
|
||||
LIBCOM_API int epicsStdCall epicsMessageQueueSendWithTimeout(
|
||||
epicsMessageQueueId id,
|
||||
void *message,
|
||||
unsigned int messageSize,
|
||||
unsigned int size,
|
||||
double timeout)
|
||||
{
|
||||
int ticks;
|
||||
int rate = sysClkRateGet();
|
||||
|
||||
if (timeout<=0.0) {
|
||||
if (timeout <= 0.0) {
|
||||
ticks = 0;
|
||||
} else {
|
||||
ticks = (int)(timeout*sysClkRateGet());
|
||||
if(ticks<=0) ticks = 1;
|
||||
}
|
||||
return msgQSend((MSG_Q_ID)id, (char *)message, messageSize, ticks, MSG_PRI_NORMAL);
|
||||
else if (timeOut < (double) INT_MAX / rate) {
|
||||
ticks = timeout * rate;
|
||||
if (ticks == 0) {
|
||||
/* 0 < timeOut < 1/rate; round up */
|
||||
ticks = 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* timeOut is NaN or too big to represent in ticks */
|
||||
ticks = WAIT_FOREVER;
|
||||
}
|
||||
|
||||
return msgQSend((MSG_Q_ID)id, (char *)message, size, ticks, MSG_PRI_NORMAL);
|
||||
}
|
||||
|
||||
LIBCOM_API int epicsStdCall epicsMessageQueueReceiveWithTimeout(
|
||||
@@ -42,12 +52,22 @@ LIBCOM_API int epicsStdCall epicsMessageQueueReceiveWithTimeout(
|
||||
double timeout)
|
||||
{
|
||||
int ticks;
|
||||
int rate = sysClkRateGet();
|
||||
|
||||
if (timeout<=0.0) {
|
||||
if (timeout <= 0.0) {
|
||||
ticks = 0;
|
||||
} else {
|
||||
ticks = (int)(timeout*sysClkRateGet());
|
||||
if(ticks<=0) ticks = 1;
|
||||
}
|
||||
else if (timeOut < (double) INT_MAX / rate) {
|
||||
ticks = timeout * rate;
|
||||
if (ticks == 0) {
|
||||
/* 0 < timeOut < 1/rate, round up */
|
||||
ticks = 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* timeOut is NaN or too big to represent in ticks */
|
||||
ticks = WAIT_FOREVER;
|
||||
}
|
||||
|
||||
return msgQReceive((MSG_Q_ID)id, (char *)message, size, ticks);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user