From cf2fef2405aee3469fd4f9d82ccebc77bd4454e6 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 30 Apr 2020 23:27:43 -0500 Subject: [PATCH] osdMessageQueue: Return sooner on -ve timeout It appears that previously a negative timeout actually implemented a 'wait forever', but the VxWorks and RTEMS implementations both check for (timeout <= 0) and return immediately if nothing can be done without waiting. --- src/libCom/osi/os/default/osdMessageQueue.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/libCom/osi/os/default/osdMessageQueue.cpp b/src/libCom/osi/os/default/osdMessageQueue.cpp index 81d0fa015..c93be4d97 100644 --- a/src/libCom/osi/os/default/osdMessageQueue.cpp +++ b/src/libCom/osi/os/default/osdMessageQueue.cpp @@ -165,7 +165,7 @@ mySend(epicsMessageQueueId pmsg, void *message, unsigned int size, /* * Return if not allowed to wait */ - if (timeout == 0) { + if (timeout <= 0) { epicsMutexUnlock(pmsg->mutex); return -1; } @@ -186,11 +186,8 @@ mySend(epicsMessageQueueId pmsg, void *message, unsigned int size, epicsMutexUnlock(pmsg->mutex); - epicsEventStatus status; - if (timeout > 0) - status = epicsEventWaitWithTimeout(threadNode.evp->event, timeout); - else - status = epicsEventWait(threadNode.evp->event); + epicsEventStatus status = + epicsEventWaitWithTimeout(threadNode.evp->event, timeout); epicsMutexMustLock(pmsg->mutex); @@ -304,7 +301,7 @@ myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size, /* * Return if not allowed to wait */ - if (timeout == 0) { + if (timeout <= 0) { epicsMutexUnlock(pmsg->mutex); return -1; } @@ -335,10 +332,11 @@ myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size, ellAdd(&pmsg->receiveQueue, &threadNode.link); epicsMutexUnlock(pmsg->mutex); - if (timeout > 0) + /* + * Wait for a message to arrive + */ + epicsEventStatus status = epicsEventWaitWithTimeout(threadNode.evp->event, timeout); - else - epicsEventWait(threadNode.evp->event); epicsMutexMustLock(pmsg->mutex);