working on queue code

This commit is contained in:
Marty Kraimer
2012-05-09 14:06:17 -04:00
parent 87bff33c30
commit fb453ea9e5
13 changed files with 227 additions and 377 deletions
+3 -3
View File
@@ -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
#----------------------------------------
+13 -10
View File
@@ -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
View File
@@ -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);
}