diff --git a/pvDataApp/Makefile b/pvDataApp/Makefile index 57a4d9b..03c1ef3 100644 --- a/pvDataApp/Makefile +++ b/pvDataApp/Makefile @@ -39,6 +39,7 @@ LIBSRCS += executor.cpp LIBSRCS += timeFunction.cpp LIBSRCS += timer.cpp LIBSRCS += status.cpp +LIBSRCS += messageQueue.cpp SRC_DIRS += $(PVDATA)/pv diff --git a/pvDataApp/misc/messageQueue.cpp b/pvDataApp/misc/messageQueue.cpp new file mode 100644 index 0000000..1d690c6 --- /dev/null +++ b/pvDataApp/misc/messageQueue.cpp @@ -0,0 +1,108 @@ +/* messageQueue.cpp */ +/** + * Copyright - See the COPYRIGHT that is included with this distribution. + * EPICS pvDataCPP is distributed subject to a Software License Agreement found + * in file LICENSE that is included with this distribution. + */ +#include +#include +namespace epics { namespace pvData { + +MessageNode::MessageNode() +: messageType(infoMessage) +{} + +String MessageNode::getMessage() const +{ + return message; +} + +MessageType MessageNode::getMessageType() const +{ + return messageType; +} + +MessageQueuePtr MessageQueue::create(int size) +{ + MessageNodePtrArray nodeArray; + nodeArray.reserve(size); + for(int i=0; i(new MessageQueue(nodeArray)); +} + +MessageQueue::MessageQueue(MessageNodePtrArray &data) +: Queue(data), + overrun(0) +{ } + +MessageQueue::~MessageQueue() +{ +} + +MessageNodePtr &MessageQueue::get() { + if(getNumberUsed()==0) return nullNode; + lastGet = getUsed(); + return lastGet; +} + +void MessageQueue::release() { + if(lastGet.get()==NULL) return; + releaseUsed(lastGet); + lastGet.reset(); +} +bool MessageQueue::put(String message,MessageType messageType,bool replaceLast) +{ + MessageNodePtr node = getFree(); + if(node.get()!= NULL) { + node->message = message; + node->messageType = messageType; + lastPut = node; + setUsed(node); + return true; + } + overrun++; + if(replaceLast) { + node = lastPut; + node->message = message; + node->messageType = messageType; + return true; + } + return false; +} + +bool MessageQueue::isEmpty() +{ + int free = getNumberFree(); + if(free==capacity()) return true; + return false; +} + +bool MessageQueue::isFull() +{ + if(getNumberFree()==0) return true; + return false; +} + +int MessageQueue::getClearOverrun() +{ + int num = overrun; + overrun = 0; + return num; +} + +MessageQueuePtr createMessageQueue(int size) +{ + MessageNodePtrArray nodeArray; + nodeArray.reserve(size); + for(int i=0; i(new MessageQueue(nodeArray)); +} + + +}} diff --git a/pvDataApp/misc/messageQueue.h b/pvDataApp/misc/messageQueue.h index 5c51a11..3131f2b 100644 --- a/pvDataApp/misc/messageQueue.h +++ b/pvDataApp/misc/messageQueue.h @@ -25,9 +25,9 @@ typedef std::tr1::shared_ptr MessageQueuePtr; class MessageNode { public: - MessageNode() : messageType(infoMessage) {} - String getMessage() const { return message;} - MessageType getMessageType() const {return messageType;} + MessageNode(); + String getMessage() const; + MessageType getMessageType() const; private: String message; MessageType messageType; @@ -55,75 +55,6 @@ private: uint32 overrun; }; -MessageQueuePtr MessageQueue::create(int size) -{ - MessageNodePtrArray nodeArray; - nodeArray.reserve(size); - for(int i=0; i(new MessageQueue(nodeArray)); -} - -MessageQueue::MessageQueue(MessageNodePtrArray &data) -: Queue(data), - overrun(0) -{ } - -MessageNodePtr &MessageQueue::get() { - if(getNumberUsed()==0) return nullNode; - lastGet = getUsed(); - return lastGet; -} - -void MessageQueue::release() { - if(lastGet.get()==NULL) return; - releaseUsed(lastGet); - lastGet.reset(); -} - -bool MessageQueue::put(String message,MessageType messageType,bool replaceLast) -{ - MessageNodePtr node = getFree(); - if(node.get()!= NULL) { - node->message = message; - node->messageType = messageType; - lastPut = node; - setUsed(node); - return true; - } - overrun++; - if(replaceLast) { - node = lastPut; - node->message = message; - node->messageType = messageType; - return true; - } - return false; -} - -bool MessageQueue::isEmpty() -{ - int free = getNumberFree(); - if(free==capacity()) return true; - return false; -} - -bool MessageQueue::isFull() -{ - if(getNumberFree()==0) return true; - return false; -} - -int MessageQueue::getClearOverrun() -{ - int num = overrun; - overrun = 0; - return num; -} - - }} #endif /* MESSAGEQUEUE_H */ diff --git a/testApp/misc/testMessageQueue.cpp b/testApp/misc/testMessageQueue.cpp index 3e5127b..afa9d28 100644 --- a/testApp/misc/testMessageQueue.cpp +++ b/testApp/misc/testMessageQueue.cpp @@ -49,11 +49,11 @@ static void testBasic(FILE * fd,FILE *auxfd ) { assert(result); result = queue->put(messages[1],infoMessage,true); assert(result); - result = queue->put(messages[2],infoMessage,true); + result = queue->put(messages[2],warningMessage,true); assert(result); assert(queue->isFull()); result = queue->put(messages[3],infoMessage,true); - assert(result==false); + assert(result==true); messageNode = queue->get(); assert(messageNode.get()!=0); fprintf(fd,"message %s messageType %s\n",