working on queue code
This commit is contained in:
@@ -38,9 +38,9 @@ PROD_HOST += testQueue
|
||||
testQueue_SRCS += testQueue.cpp
|
||||
testQueue_LIBS += pvData Com
|
||||
|
||||
#PROD_HOST += testMessageQueue
|
||||
#testMessageQueue_SRCS += testMessageQueue.cpp
|
||||
#testMessageQueue_LIBS += pvData Com
|
||||
PROD_HOST += testMessageQueue
|
||||
testMessageQueue_SRCS += testMessageQueue.cpp
|
||||
testMessageQueue_LIBS += pvData Com
|
||||
|
||||
include $(TOP)/configure/RULES
|
||||
#----------------------------------------
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* in file LICENSE that is included with this distribution.
|
||||
*/
|
||||
/*
|
||||
* testQueue.cpp
|
||||
* testMessageQueue.cpp
|
||||
*
|
||||
* Created on: 2010.12
|
||||
* Author: Marty Kraimer
|
||||
@@ -33,12 +33,16 @@ using namespace epics::pvData;
|
||||
|
||||
static void testBasic(FILE * fd,FILE *auxfd ) {
|
||||
int queueSize = 3;
|
||||
String messages[]= {
|
||||
String("1"),String("2"),String("3"),String("4"),String("5")
|
||||
};
|
||||
MessageQueue *queue = new MessageQueue(queueSize);
|
||||
StringArray messages;
|
||||
messages.reserve(5);
|
||||
messages.push_back("1");
|
||||
messages.push_back("2");
|
||||
messages.push_back("3");
|
||||
messages.push_back("4");
|
||||
messages.push_back("5");
|
||||
MessageQueuePtr queue = MessageQueue::create(queueSize);
|
||||
bool result;
|
||||
MessageNode *messageNode;
|
||||
MessageNodePtr messageNode;
|
||||
result = queue->isEmpty();
|
||||
assert(result);
|
||||
result = queue->put(messages[0],infoMessage,true);
|
||||
@@ -51,25 +55,24 @@ static void testBasic(FILE * fd,FILE *auxfd ) {
|
||||
result = queue->put(messages[3],infoMessage,true);
|
||||
assert(result==false);
|
||||
messageNode = queue->get();
|
||||
assert(messageNode!=0);
|
||||
assert(messageNode.get()!=0);
|
||||
fprintf(fd,"message %s messageType %s\n",
|
||||
messageNode->getMessage().c_str(),
|
||||
messageTypeName[messageNode->getMessageType()].c_str());
|
||||
assert(messageNode->getMessage().compare(messages[0])==0);
|
||||
queue->release();
|
||||
messageNode = queue->get();
|
||||
assert(messageNode!=0);
|
||||
assert(messageNode.get()!=0);
|
||||
assert(messageNode->getMessage().compare(messages[1])==0);
|
||||
queue->release();
|
||||
messageNode = queue->get();
|
||||
assert(messageNode!=0);
|
||||
assert(messageNode.get()!=0);
|
||||
fprintf(fd,"message %s messageType %s\n",
|
||||
messageNode->getMessage().c_str(),
|
||||
messageTypeName[messageNode->getMessageType()].c_str());
|
||||
assert(messageNode->getMessage().compare(messages[3])==0);
|
||||
queue->release();
|
||||
result = queue->isEmpty();
|
||||
delete queue;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
+29
-19
@@ -22,7 +22,6 @@
|
||||
#include <pv/lock.h>
|
||||
#include <pv/timeStamp.h>
|
||||
#include <pv/queue.h>
|
||||
#include <pv/CDRMonitor.h>
|
||||
#include <pv/event.h>
|
||||
#include <pv/thread.h>
|
||||
#include <pv/executor.h>
|
||||
@@ -35,19 +34,25 @@ struct Data {
|
||||
int b;
|
||||
};
|
||||
|
||||
typedef std::tr1::shared_ptr<Data> DataPtr;
|
||||
typedef std::vector<DataPtr> DataPtrArray;
|
||||
|
||||
static const int numElements = 5;
|
||||
typedef Queue<Data> DataQueue;
|
||||
|
||||
class Sink;
|
||||
typedef std::tr1::shared_ptr<Sink> SinkPtr;
|
||||
|
||||
class Sink : public Runnable {
|
||||
public:
|
||||
static SinkPtr create(DataQueue &queue,FILE *auxfd);
|
||||
Sink(DataQueue &queue,FILE *auxfd);
|
||||
~Sink();
|
||||
void stop();
|
||||
void look();
|
||||
virtual void run();
|
||||
private:
|
||||
DataQueue queue;
|
||||
DataQueue &queue;
|
||||
FILE *auxfd;
|
||||
bool isStopped;
|
||||
Event *wait;
|
||||
@@ -57,6 +62,11 @@ private:
|
||||
Thread *thread;
|
||||
};
|
||||
|
||||
SinkPtr Sink::create(DataQueue &queue,FILE *auxfd)
|
||||
{
|
||||
return SinkPtr(new Sink(queue,auxfd));
|
||||
}
|
||||
|
||||
Sink::Sink(DataQueue &queue,FILE *auxfd)
|
||||
: queue(queue),
|
||||
auxfd(auxfd),
|
||||
@@ -96,8 +106,8 @@ void Sink::run()
|
||||
wait->wait();
|
||||
if(isStopped) break;
|
||||
while(true) {
|
||||
Data *data = queue.getUsed();
|
||||
if(data==NULL) {
|
||||
DataPtr data = queue.getUsed();
|
||||
if(data.get()==NULL) {
|
||||
waitEmpty->signal();
|
||||
break;
|
||||
}
|
||||
@@ -109,33 +119,34 @@ void Sink::run()
|
||||
}
|
||||
|
||||
static void testBasic(FILE * fd,FILE *auxfd ) {
|
||||
std::vector<std::tr1::shared_ptr<Data> >dataArray;
|
||||
DataPtrArray dataArray;
|
||||
dataArray.reserve(numElements);
|
||||
for(int i=0; i<numElements; i++) {
|
||||
dataArray.push_back(std::tr1::shared_ptr<Data>(new Data()));
|
||||
dataArray.push_back(DataPtr(new Data()));
|
||||
}
|
||||
DataQueue queue(dataArray);
|
||||
Data *pdata = queue.getFree();
|
||||
DataPtr data = queue.getFree();
|
||||
int value = 0;
|
||||
while(pdata!=NULL) {
|
||||
pdata->a = value;
|
||||
pdata->b = value*10;
|
||||
while(data.get()!=NULL) {
|
||||
data->a = value;
|
||||
data->b = value*10;
|
||||
value++;
|
||||
queue.setUsed(pdata);
|
||||
pdata = queue.getFree();
|
||||
queue.setUsed(data);
|
||||
data = queue.getFree();
|
||||
}
|
||||
std::tr1::shared_ptr<Sink> sink = std::tr1::shared_ptr<Sink>(new Sink(queue,auxfd));
|
||||
SinkPtr sink = SinkPtr(new Sink(queue,auxfd));
|
||||
queue.clear();
|
||||
while(true) {
|
||||
Data * data = queue.getFree();
|
||||
if(data==NULL) break;
|
||||
data = queue.getFree();
|
||||
if(data.get()==NULL) break;
|
||||
fprintf(auxfd,"source a %d b %d\n",data->a,data->b);
|
||||
queue.setUsed(data);
|
||||
}
|
||||
sink->look();
|
||||
// now alternate
|
||||
for(int i=0; i<numElements; i++) {
|
||||
Data *data = queue.getFree();
|
||||
assert(data!=NULL);
|
||||
data = queue.getFree();
|
||||
assert(data.get()!=NULL);
|
||||
fprintf(auxfd,"source a %d b %d\n",data->a,data->b);
|
||||
queue.setUsed(data);
|
||||
sink->look();
|
||||
@@ -143,6 +154,7 @@ static void testBasic(FILE * fd,FILE *auxfd ) {
|
||||
sink->stop();
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
char *fileName = 0;
|
||||
if(argc>1) fileName = argv[1];
|
||||
@@ -157,8 +169,6 @@ int main(int argc, char *argv[]) {
|
||||
auxfd = fopen(auxFileName,"w+");
|
||||
}
|
||||
testBasic(fd,auxfd);
|
||||
epicsExitCallAtExits();
|
||||
CDRMonitor::get().show(fd);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user