Fix timeout values in epicsEventWaitWithTimeout()

isnan(timeOut) => wait forever
0 < timeOut < 1/rate => 1 tick
This commit is contained in:
Andrew Johnson
2022-01-04 13:05:21 -06:00
parent 6063de9a8b
commit 34baa485bc
2 changed files with 39 additions and 14 deletions

View File

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

View File

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