diff --git a/src/libCom/ring/epicsMessageQueue.cpp b/src/libCom/ring/epicsMessageQueue.cpp index 70832028b..773e52ef7 100644 --- a/src/libCom/ring/epicsMessageQueue.cpp +++ b/src/libCom/ring/epicsMessageQueue.cpp @@ -78,8 +78,8 @@ epicsMessageQueue::send(void *message, unsigned int size) return true; } -bool -epicsMessageQueue::receive(void *message, unsigned int *size, bool withTimeout, double timeout) +int +epicsMessageQueue::receive(void *message, bool withTimeout, double timeout) { char *myOutPtr; unsigned long l; @@ -90,7 +90,7 @@ epicsMessageQueue::receive(void *message, unsigned int *size, bool withTimeout, queueMutex.unlock(); if (withTimeout) { if (queueEvent.wait(timeout) == false) - return false; + return -1; } else { queueEvent.wait(); @@ -98,7 +98,7 @@ epicsMessageQueue::receive(void *message, unsigned int *size, bool withTimeout, queueMutex.lock(); myOutPtr = (char *)outPtr; } - *size = l = *(unsigned long *)myOutPtr; + l = *(unsigned long *)myOutPtr; memcpy(message, (unsigned long *)myOutPtr + 1, l); if (myOutPtr == lastMessageSlot) myOutPtr = firstMessageSlot; @@ -107,36 +107,36 @@ epicsMessageQueue::receive(void *message, unsigned int *size, bool withTimeout, this->outPtr = myOutPtr; full = false; queueMutex.unlock(); - return true; + return l; } -void -epicsMessageQueue::receive(void *message, unsigned int *size) +int +epicsMessageQueue::receive(void *message ) { - this->receive(message, size, false, 0.0); + return this->receive(message, false, 0.0); } -bool -epicsMessageQueue::receive(void *message, unsigned int *size, double timeout) +int +epicsMessageQueue::receive(void *message, double timeout) { - return this->receive(message, size, true, timeout); + return this->receive(message, true, timeout); } -bool -epicsMessageQueue::isFull() const +unsigned int +epicsMessageQueue::pending() const { - return full; -} + char *myInPtr, *myOutPtr; + int nmsg; -bool -epicsMessageQueue::isEmpty() -{ - bool empty; - - queueMutex.lock(); - empty = ((outPtr == inPtr) && !full); - queueMutex.unlock(); - return empty; + myInPtr = (char *)inPtr; + myOutPtr = (char *)outPtr; + if (myInPtr >= myOutPtr) + nmsg = (myInPtr - myOutPtr) / slotSize; + else + nmsg = capacity - (myOutPtr - myInPtr) / slotSize; + if (full) + nmsg = capacity; + return nmsg; } void @@ -188,33 +188,25 @@ epicsShareFunc int epicsShareAPI epicsMessageQueueSend( return ((epicsMessageQueue *)id)->send(message, messageSize); } -epicsShareFunc void epicsShareAPI epicsMessageQueueReceive( +epicsShareFunc int epicsShareAPI epicsMessageQueueReceive( epicsMessageQueueId id, - void *message, - unsigned int *messageSize) + void *message) { - ((epicsMessageQueue *)id)->receive(message, messageSize); + return ((epicsMessageQueue *)id)->receive(message); } epicsShareFunc int epicsShareAPI epicsMessageQueueReceiveWithTimeout( epicsMessageQueueId id, void *message, - unsigned int *messageSize, double timeout) { - return ((epicsMessageQueue *)id)->receive(message, messageSize, timeout); + return ((epicsMessageQueue *)id)->receive(message, timeout); } -epicsShareFunc int epicsShareAPI epicsMessageQueueIsFull( +epicsShareFunc int epicsShareAPI epicsMessageQueuePending( epicsMessageQueueId id) { - return ((epicsMessageQueue *)id)->isFull(); -} - -epicsShareFunc int epicsShareAPI epicsMessageQueueIsEmpty( - epicsMessageQueueId id) -{ - return ((epicsMessageQueue *)id)->isEmpty(); + return ((epicsMessageQueue *)id)->pending(); } epicsShareFunc void epicsShareAPI epicsMessageQueueShow( diff --git a/src/libCom/ring/epicsMessageQueue.h b/src/libCom/ring/epicsMessageQueue.h index 0515f098e..cddeb5742 100644 --- a/src/libCom/ring/epicsMessageQueue.h +++ b/src/libCom/ring/epicsMessageQueue.h @@ -34,11 +34,11 @@ public: unsigned int maximumMessageSize ); ~epicsMessageQueue (); bool send ( void *message, unsigned int messageSize ); - void receive ( void *message, unsigned int *messageSize ); - bool receive ( void *message, unsigned int *messageSize, double timeout ); + bool send ( void *message, unsigned int messageSize, double timeout ); + int receive ( void *message ); + int receive ( void *message, double timeout ); void show ( unsigned int level = 0 ) const; - bool isFull () const; - bool isEmpty (); + unsigned int pending () const; private: // Prevent compiler-generated member functions // default constructor, copy constructor, assignment operator @@ -47,7 +47,7 @@ private: // Prevent compiler-generated member functions epicsMessageQueue& operator=(const epicsMessageQueue &); private: - bool receive ( void *message, unsigned int *messageSize, bool withTimeout, double timeout ); + int receive ( void *message, bool withTimeout, double timeout ); volatile char *inPtr; volatile char *outPtr; @@ -76,7 +76,12 @@ epicsShareFunc int epicsShareAPI epicsMessageQueueSend( epicsMessageQueueId id, void *message, unsigned int messageSize); -epicsShareFunc void epicsShareAPI epicsMessageQueueReceive( +epicsShareFunc int epicsShareAPI epicsMessageQueueSendWithTimeout( + epicsMessageQueueId id, + void *message, + unsigned int messageSize, + double timeout); +epicsShareFunc int epicsShareAPI epicsMessageQueueReceive( epicsMessageQueueId id, void *message, unsigned int *messageSize); @@ -85,9 +90,7 @@ epicsShareFunc int epicsShareAPI epicsMessageQueueReceiveWithTimeout( void *message, unsigned int *messageSize, double timeout); -epicsShareFunc int epicsShareAPI epicsMessageQueueIsFull( - epicsMessageQueueId id); -epicsShareFunc int epicsShareAPI epicsMessageQueueIsEmpty( +epicsShareFunc int epicsShareAPI epicsMessageQueuePending( epicsMessageQueueId id); epicsShareFunc void epicsShareAPI epicsMessageQueueShow( epicsMessageQueueId id,