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

View File

@@ -12,106 +12,33 @@
namespace epics { namespace pvData {
typedef QueueElement<MonitorElement::shared_pointer> MonitorQueueElement;
class MonitorElementImpl : public MonitorElement {
public:
MonitorElementImpl(PVStructure::shared_pointer pvStructure);
~MonitorElementImpl(){}
virtual PVStructure::shared_pointer const & getPVStructure();
virtual BitSet::shared_pointer const & getChangedBitSet();
virtual BitSet::shared_pointer const & getOverrunBitSet();
void setQueueElement(MonitorQueueElement *queueElement);
MonitorQueueElement *getQueueElement();
private:
PVStructure::shared_pointer pvStructure;
BitSet::shared_pointer changedBitSet;
BitSet::shared_pointer overrunBitSet;
MonitorQueueElement *queueElement;
};
MonitorElementImpl::MonitorElementImpl(PVStructure::shared_pointer pvStructure)
: pvStructure(pvStructure),
changedBitSet(BitSet::shared_pointer(
new BitSet(pvStructure->getNumberFields()))),
overrunBitSet(BitSet::shared_pointer(
new BitSet(pvStructure->getNumberFields()))),
queueElement(0)
{}
PVStructure::shared_pointer const & MonitorElementImpl::getPVStructure()
MonitorElementArray MonitorQueue::createMonitorElements(
StructureConstPtr & elementStructure,int number)
{
return pvStructure;
PVDataCreatePtr pvDataCreate = getPVDataCreate();
MonitorElementArray elementArray(number);
for(int i=0; i<number; i++) {
PVStructurePtr pvStructurePtr
= pvDataCreate->createPVStructure(elementStructure);
MonitorElementPtr monitorElement(new MonitorElement(pvStructurePtr));
elementArray[i] = monitorElement;
}
return elementArray;
}
BitSet::shared_pointer const & MonitorElementImpl::getChangedBitSet()
{
return changedBitSet;
}
BitSet::shared_pointer const & MonitorElementImpl::getOverrunBitSet()
{
return overrunBitSet;
}
void MonitorElementImpl::setQueueElement(MonitorQueueElement *queueElement)
{
this->queueElement = queueElement;
}
MonitorQueueElement *MonitorElementImpl::getQueueElement()
{
return queueElement;
}
MonitorQueue::MonitorQueue(PVStructureSharedPointerPtrArray structures,int number)
: number(number),
structures(structures),
queue(0),
queueElements(new MonitorElement::shared_pointer*[number]),
nullElement(MonitorElement::shared_pointer())
MonitorQueue::MonitorQueue(MonitorElementArray monitorElementArray)
: elementArray(monitorElementArray),
queue(elementArray)//,
//number(monitorElementArray.size())
{
number = monitorElementArray.size();
if(number<2) {
throw std::logic_error(String("queueSize must be >=2"));
}
for(int i=0; i<number; i++) {
queueElements[i] = new MonitorElement::shared_pointer(
new MonitorElementImpl(*structures[i]));
}
queue = new Queue<MonitorElement::shared_pointer>(queueElements,number);
MonitorQueueElement *queueElement;
for(int i=0; i<number;i++) {
queueElement = queue->getFree();
MonitorElementImpl * element = static_cast<MonitorElementImpl *>(
queueElement->getObject()->get());
element->setQueueElement(queueElement);
queue->setUsed(queueElement);
queue->releaseUsed(queueElement);
}
}
MonitorQueue::~MonitorQueue()
{
delete queue;
for(int i=0; i<number; i++) {
delete queueElements[i];
}
delete[] queueElements;
for(int i=0; i<number; i++) delete structures[i];
delete[] structures;
}
PVStructureSharedPointerPtrArray MonitorQueue::createStructures(
PVStructurePtrArray array,int number)
{
PVStructureSharedPointerPtrArray elements =
new PVStructureSharedPointerPtr[number];
for(int i=0; i<number; i++){
elements[i] = new PVStructure::shared_pointer(array[i]);
}
delete[] array;
return elements;
}
void MonitorQueue::clear()
@@ -129,11 +56,11 @@ int MonitorQueue::capacity()
return number;
}
MonitorElement::shared_pointer const & MonitorQueue::getFree()
MonitorElementPtr & MonitorQueue::getFree()
{
MonitorQueueElement *queueElement = queue->getFree();
MonitorElementPtr * queueElement = queue->getFree();
if(queueElement==0) return nullElement;
return *queueElement->getObject();
return *queueElement;
}
void MonitorQueue::setUsed(MonitorElement::shared_pointer const & element)
@@ -155,6 +82,5 @@ void MonitorQueue::releaseUsed(MonitorElement::shared_pointer const & element)
queue->releaseUsed(impl->getQueueElement());
}
}}