diff --git a/modules/libcom/src/osi/os/vxWorks/osdEvent.c b/modules/libcom/src/osi/os/vxWorks/osdEvent.c index 27b271e51..dc139432c 100644 --- a/modules/libcom/src/osi/os/vxWorks/osdEvent.c +++ b/modules/libcom/src/osi/os/vxWorks/osdEvent.c @@ -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) diff --git a/modules/libcom/src/osi/os/vxWorks/osdMessageQueue.cpp b/modules/libcom/src/osi/os/vxWorks/osdMessageQueue.cpp index bf27daf1b..d06952209 100644 --- a/modules/libcom/src/osi/os/vxWorks/osdMessageQueue.cpp +++ b/modules/libcom/src/osi/os/vxWorks/osdMessageQueue.cpp @@ -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); }