From 183c3b2a3e1fa2a55cd918b94ef4d7c486e11bf4 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 30 Apr 2020 23:38:51 -0500 Subject: [PATCH] osdMessageQueue: Clear eventNode before returning it Introduced freeEventNode() which ensures eventNodes don't have a signalled event in them before returning the node to the freeList. Callers pass the status from epicsEventWaitWithTimeout() to indicate whether it was signalled or not. If it timed out we must trigger it and Wait to clear the event state. --- src/libCom/osi/os/default/osdMessageQueue.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/libCom/osi/os/default/osdMessageQueue.cpp b/src/libCom/osi/os/default/osdMessageQueue.cpp index c93be4d97..0e1d1fc22 100644 --- a/src/libCom/osi/os/default/osdMessageQueue.cpp +++ b/src/libCom/osi/os/default/osdMessageQueue.cpp @@ -145,6 +145,16 @@ getEventNode(epicsMessageQueueId pmsg) return evp; } +static void +freeEventNode(epicsMessageQueueId pmsg, eventNode *evp, epicsEventStatus status) +{ + if (status == epicsEventWaitTimeout) { + epicsEventSignal(evp->event); + epicsEventWait(evp->event); + } + ellAdd(&pmsg->eventFreeList, &evp->link); +} + static int mySend(epicsMessageQueueId pmsg, void *message, unsigned int size, double timeout) @@ -195,7 +205,7 @@ mySend(epicsMessageQueueId pmsg, void *message, unsigned int size, ellDelete(&pmsg->sendQueue, &threadNode.link); pmsg->numberOfSendersWaiting--; - ellAdd(&pmsg->eventFreeList, &threadNode.evp->link); + freeEventNode(pmsg, threadNode.evp, status); if ((pmsg->full && (ellFirst(&pmsg->receiveQueue) == NULL)) || status != epicsEventOK) { @@ -342,7 +352,8 @@ myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size, if (!threadNode.eventSent) ellDelete(&pmsg->receiveQueue, &threadNode.link); - ellAdd(&pmsg->eventFreeList, &threadNode.evp->link); + + freeEventNode(pmsg, threadNode.evp, status); epicsMutexUnlock(pmsg->mutex);