use newer API

This commit is contained in:
Michael Davidsaver
2017-06-29 11:36:35 +02:00
parent ba485df469
commit 51f5480996
6 changed files with 65 additions and 100 deletions

View File

@ -117,7 +117,7 @@ MonitorCacheEntry::monitorEvent(pvd::MonitorPtr const & monitor)
shared_pointer self(weakref); // keeps us alive in case all MonitorUsers are destroy()ed
pvd::MonitorElementPtr update;
pva::MonitorElementPtr update;
typedef std::vector<MonitorUser::shared_pointer> dsnotify_t;
dsnotify_t dsnotify;
@ -306,8 +306,8 @@ MonitorUser::start()
if(lval && !empty.empty()) {
//already running, notify of initial element
pvd::MonitorElementPtr elem(empty.front());
elem->pvStructurePtr = lval;
const pva::MonitorElementPtr& elem(empty.front());
elem->pvStructurePtr->copy(*lval);
elem->changedBitSet->set(0); // indicate all changed
elem->overrunBitSet->clear();
filled.push_back(elem);
@ -330,11 +330,11 @@ MonitorUser::stop()
return pvd::Status::Ok;
}
pvd::MonitorElementPtr
pva::MonitorElementPtr
MonitorUser::poll()
{
Guard G(mutex());
pvd::MonitorElementPtr ret;
pva::MonitorElementPtr ret;
if(!filled.empty()) {
ret = filled.front();
inuse.insert(ret); // track which ones are out for client use
@ -345,7 +345,7 @@ MonitorUser::poll()
}
void
MonitorUser::release(pvd::MonitorElementPtr const & monitorElement)
MonitorUser::release(pva::MonitorElementPtr const & monitorElement)
{
Guard G(mutex());
//TODO: ifdef DEBUG? (only track inuse when debugging?)

View File

@ -449,6 +449,7 @@ PDBProvider::PDBProvider()
PDBProvider::~PDBProvider()
{
epics::atomic::decrement(ninstances);
std::cerr<<"########## "<<__PRETTY_FUNCTION__<<"\n";
{
epicsGuard<epicsMutex> G(transient_pv_map.mutex());
if(event_context) {
@ -464,6 +465,7 @@ PDBProvider::~PDBProvider()
void PDBProvider::destroy()
{
dbEventCtx ctxt = NULL;
std::cerr<<"########## "<<__PRETTY_FUNCTION__<<"\n";
persist_pv_map_t ppv;
{
epicsGuard<epicsMutex> G(transient_pv_map.mutex());
@ -530,6 +532,7 @@ PDBProvider::createChannel(std::string const & channelName,
pva::Channel::shared_pointer ret;
PDBPV::shared_pointer pv;
pvd::Status status;
std::cerr<<"######## "<<__PRETTY_FUNCTION__<<" name"<<channelName<<"\n";
{
epicsGuard<epicsMutex> G(transient_pv_map.mutex());

View File

@ -84,7 +84,7 @@ struct TestMonitor {
upstream->dispatch(); // trigger monitorEvent() from upstream to gateway
testOk1(mreq->eventCnt==1);
pvd::MonitorElementPtr elem(mon->poll());
pva::MonitorElementPtr elem(mon->poll());
testOk1(!!elem.get());
if(!!elem.get()) testEqual(toString(*elem->changedBitSet), "{0}");
else testFail("oops");
@ -122,8 +122,8 @@ struct TestMonitor {
testOk1(mreq->eventCnt==1);
testOk1(mreq2->eventCnt==1);
pvd::MonitorElementPtr elem(mon->poll());
pvd::MonitorElementPtr elem2(mon2->poll());
pva::MonitorElementPtr elem(mon->poll());
pva::MonitorElementPtr elem2(mon2->poll());
testOk1(!!elem.get());
testOk1(!!elem2.get());
testOk1(elem!=elem2);
@ -210,7 +210,7 @@ struct TestMonitor {
testOk1(mreq->eventCnt==1);
testDiag("poll initial update");
pvd::MonitorElementPtr elem(mon->poll());
pva::MonitorElementPtr elem(mon->poll());
testOk1(!!elem.get());
if(elem) mon->release(elem);
@ -284,7 +284,7 @@ struct TestMonitor {
testOk1(mreq->eventCnt==1);
testDiag("poll initial update");
pvd::MonitorElementPtr elem(mon->poll());
pva::MonitorElementPtr elem(mon->poll());
testOk1(!!elem.get());
if(elem) mon->release(elem);

View File

@ -108,30 +108,6 @@ struct PVMonitor : public PVConnect
mon->destroy();
}
struct Element {
pva::MonitorElementPtr elem;
pva::Monitor::shared_pointer mon;
Element(const PVMonitor& m) : mon(m.mon) {}
~Element() {
if(elem) mon->release(elem);
}
Element& operator=(const pva::MonitorElementPtr& e) {
if(elem) mon->release(elem);
elem = e;
return *this;
}
pvd::BitSet& changed() { return *elem->changedBitSet; }
pvd::BitSet& overflow() { return *elem->overrunBitSet; }
pvd::PVStructure* operator->() { return elem->pvStructurePtr.get(); }
operator pvd::PVStructurePtr&() { return elem->pvStructurePtr; }
bool operator!() const { return !elem; }
private:
Element(const Element& e);
Element& operator=(const Element& e);
};
pva::MonitorElementPtr poll() { return mon->poll(); }
};
@ -278,18 +254,15 @@ void testSingleMonitor(const PDBProvider::shared_pointer& prov)
testOk1(mon.monreq->waitForEvent());
testDiag("Initial event");
PVMonitor::Element e(mon);
e = mon.poll();
pva::MonitorElement::Ref e(mon.mon);
testOk1(!!e);
testOk1(!!e && e.elem->changedBitSet->get(0));
testFieldEqual<pvd::PVDouble>(e, "value", 1.0);
testFieldEqual<pvd::PVDouble>(e, "display.limitHigh", 100.0);
testFieldEqual<pvd::PVDouble>(e, "display.limitLow", -100.0);
testOk1(!!e && e->changedBitSet->get(0));
testFieldEqual<pvd::PVDouble>(e->pvStructurePtr, "value", 1.0);
testFieldEqual<pvd::PVDouble>(e->pvStructurePtr, "display.limitHigh", 100.0);
testFieldEqual<pvd::PVDouble>(e->pvStructurePtr, "display.limitLow", -100.0);
e = mon.poll();
testOk1(!e);
testOk1(!e.next());
testDiag("trigger new VALUE event");
testdbPutFieldOk("rec1", DBR_DOUBLE, 11.0);
@ -297,14 +270,12 @@ void testSingleMonitor(const PDBProvider::shared_pointer& prov)
testDiag("Wait for event");
mon.monreq->waitForEvent();
e = mon.poll();
testOk1(!!e);
if(!!e) testEqual(toString(*e.elem->changedBitSet), "{1, 3, 4, 7, 8}");
testOk1(!!e.next());
if(!!e) testEqual(toString(*e->changedBitSet), "{1, 3, 4, 7, 8}");
else testFail("oops");
testFieldEqual<pvd::PVDouble>(e, "value", 11.0);
testFieldEqual<pvd::PVDouble>(e->pvStructurePtr, "value", 11.0);
e = mon.poll();
testOk1(!e);
testOk1(!e.next());
testDiag("trigger new PROPERTY event");
testdbPutFieldOk("rec1.HOPR", DBR_DOUBLE, 50.0);
@ -312,14 +283,12 @@ void testSingleMonitor(const PDBProvider::shared_pointer& prov)
testDiag("Wait for event");
mon.monreq->waitForEvent();
e = mon.poll();
testOk1(!!e);
if(!!e) testEqual(toString(*e.elem->changedBitSet), "{7, 8, 11, 12, 15, 17, 18}");
testOk1(!!e.next());
if(!!e) testEqual(toString(*e->changedBitSet), "{7, 8, 11, 12, 15, 17, 18}");
else testFail("oops");
testFieldEqual<pvd::PVDouble>(e, "display.limitHigh", 50.0);
testFieldEqual<pvd::PVDouble>(e->pvStructurePtr, "display.limitHigh", 50.0);
e = mon.poll();
testOk1(!e);
testOk1(!e.next());
}
void testGroupMonitor(const PDBProvider::shared_pointer& prov)
@ -333,7 +302,7 @@ void testGroupMonitor(const PDBProvider::shared_pointer& prov)
testDiag("subscribe to grp1");
PVMonitor mon(prov, "grp1");
PVMonitor::Element e(mon);
pva::MonitorElement::Ref e(mon.mon);
testOk1(mon.mon->start().isOK());
@ -341,21 +310,19 @@ void testGroupMonitor(const PDBProvider::shared_pointer& prov)
testOk1(mon.monreq->waitForEvent());
testDiag("Initial event");
e = mon.poll();
testOk1(!!e);
testOk1(!!e.next());
testOk1(!!e && e.elem->changedBitSet->get(0));
testFieldEqual<pvd::PVDouble>(e, "fld1.value", 3.0);
testFieldEqual<pvd::PVInt>(e, "fld2.value", 30);
testFieldEqual<pvd::PVDouble>(e, "fld3.value", 4.0);
testFieldEqual<pvd::PVInt>(e, "fld4.value", 40);
testFieldEqual<pvd::PVDouble>(e, "fld1.display.limitHigh", 200.0);
testFieldEqual<pvd::PVDouble>(e, "fld1.display.limitLow", -200.0);
testFieldEqual<pvd::PVDouble>(e, "fld2.display.limitHigh", 2147483647.0);
testFieldEqual<pvd::PVDouble>(e, "fld2.display.limitLow", -2147483648.0);
testOk1(!!e && e->changedBitSet->get(0));
testFieldEqual<pvd::PVDouble>(e->pvStructurePtr, "fld1.value", 3.0);
testFieldEqual<pvd::PVInt>(e->pvStructurePtr, "fld2.value", 30);
testFieldEqual<pvd::PVDouble>(e->pvStructurePtr, "fld3.value", 4.0);
testFieldEqual<pvd::PVInt>(e->pvStructurePtr, "fld4.value", 40);
testFieldEqual<pvd::PVDouble>(e->pvStructurePtr, "fld1.display.limitHigh", 200.0);
testFieldEqual<pvd::PVDouble>(e->pvStructurePtr, "fld1.display.limitLow", -200.0);
testFieldEqual<pvd::PVDouble>(e->pvStructurePtr, "fld2.display.limitHigh", 2147483647.0);
testFieldEqual<pvd::PVDouble>(e->pvStructurePtr, "fld2.display.limitLow", -2147483648.0);
e = mon.poll();
testOk1(!e);
testOk1(!e.next());
testdbPutFieldOk("rec3", DBR_DOUBLE, 32.0);
@ -363,13 +330,12 @@ void testGroupMonitor(const PDBProvider::shared_pointer& prov)
testOk1(mon.monreq->waitForEvent());
testDiag("event");
e = mon.poll();
testOk1(!!e);
testOk1(!!e && e.elem->pvStructurePtr->getSubFieldT("fld1.value")->getFieldOffset()==6);
if(!!e) testEqual(toString(*e.elem->changedBitSet), "{6, 8, 9, 12, 13}");
testOk1(!!e.next());
testOk1(!!e && e->pvStructurePtr->getSubFieldT("fld1.value")->getFieldOffset()==6);
if(!!e) testEqual(toString(*e->changedBitSet), "{6, 8, 9, 12, 13}");
else testFail("oops");
testFieldEqual<pvd::PVDouble>(e, "fld1.value", 32.0);
testFieldEqual<pvd::PVDouble>(e->pvStructurePtr, "fld1.value", 32.0);
}
void testGroupMonitorTriggers(const PDBProvider::shared_pointer& prov)
@ -382,7 +348,7 @@ void testGroupMonitorTriggers(const PDBProvider::shared_pointer& prov)
testDiag("subscribe to grp2");
PVMonitor mon(prov, "grp2");
PVMonitor::Element e(mon);
pva::MonitorElement::Ref e(mon.mon);
testOk1(mon.mon->start().isOK());
@ -390,17 +356,15 @@ void testGroupMonitorTriggers(const PDBProvider::shared_pointer& prov)
testOk1(mon.monreq->waitForEvent());
testDiag("Initial event");
e = mon.poll();
testOk1(!!e);
testOk1(!!e.next());
testOk1(!!e && e.elem->changedBitSet->get(0));
testOk1(!!e && e->changedBitSet->get(0));
testFieldEqual<pvd::PVDouble>(e, "fld1.value", 5.0);
testFieldEqual<pvd::PVDouble>(e, "fld2.value", 6.0);
testFieldEqual<pvd::PVInt>(e, "fld3.value", 0); // not triggered -> no update. only get/set
testFieldEqual<pvd::PVDouble>(e->pvStructurePtr, "fld1.value", 5.0);
testFieldEqual<pvd::PVDouble>(e->pvStructurePtr, "fld2.value", 6.0);
testFieldEqual<pvd::PVInt>(e->pvStructurePtr, "fld3.value", 0); // not triggered -> no update. only get/set
e = mon.poll();
testOk1(!e);
testOk1(!e.next());
testdbPutFieldOk("rec5.RVAL", DBR_LONG, 60); // no trigger -> no event
testdbPutFieldOk("rec5", DBR_DOUBLE, 15.0); // no trigger -> no event
@ -410,20 +374,18 @@ void testGroupMonitorTriggers(const PDBProvider::shared_pointer& prov)
testOk1(mon.monreq->waitForEvent());
testDiag("event");
e = mon.poll();
testOk1(!!e);
testOk1(!!e.next());
testOk1(!!e && e.elem->pvStructurePtr->getSubFieldT("fld1.value")->getFieldOffset()==6);
testOk1(!!e && e.elem->pvStructurePtr->getSubFieldT("fld2.value")->getFieldOffset()==46);
if(!!e) testEqual(toString(*e.elem->changedBitSet), "{6, 8, 9, 12, 13, 46, 48, 49, 52, 53}");
testOk1(!!e && e->pvStructurePtr->getSubFieldT("fld1.value")->getFieldOffset()==6);
testOk1(!!e && e->pvStructurePtr->getSubFieldT("fld2.value")->getFieldOffset()==46);
if(!!e) testEqual(toString(*e->changedBitSet), "{6, 8, 9, 12, 13, 46, 48, 49, 52, 53}");
else testFail("oops");
testFieldEqual<pvd::PVDouble>(e, "fld1.value", 15.0);
testFieldEqual<pvd::PVDouble>(e, "fld2.value", 16.0);
testFieldEqual<pvd::PVInt>(e, "fld3.value", 0); // not triggered -> no update. only get/set
testFieldEqual<pvd::PVDouble>(e->pvStructurePtr, "fld1.value", 15.0);
testFieldEqual<pvd::PVDouble>(e->pvStructurePtr, "fld2.value", 16.0);
testFieldEqual<pvd::PVInt>(e->pvStructurePtr, "fld3.value", 0); // not triggered -> no update. only get/set
e = mon.poll();
testOk1(!e);
testOk1(!e.next());
}
} // namespace

View File

@ -72,7 +72,7 @@ void testmonitor()
testDiag("Start monitor and check initial update");
testOk1(mon->start().isSuccess());
pvd::MonitorElementPtr elem(mon->poll());
pva::MonitorElementPtr elem(mon->poll());
testOk1(!!elem.get());
if(elem) testDiag("elem changed '%s' overflow '%s'", toString(*elem->changedBitSet).c_str(), toString(*elem->overrunBitSet).c_str());

View File

@ -271,7 +271,7 @@ TestPVMonitor::TestPVMonitor(const TestPVChannel::shared_pointer& ch,
{
pvd::PVDataCreatePtr fact(pvd::PVDataCreate::getPVDataCreate());
for(size_t i=0; i<bsize; i++) {
pvd::MonitorElementPtr elem(new pvd::MonitorElement(fact->createPVStructure(channel->pv->dtype)));
pva::MonitorElementPtr elem(new pvd::MonitorElement(fact->createPVStructure(channel->pv->dtype)));
free.push_back(elem);
}
overflow.reset(new pvd::MonitorElement(fact->createPVStructure(channel->pv->dtype)));
@ -317,7 +317,7 @@ pvd::Status TestPVMonitor::start()
}
if(!this->free.empty()) {
pvd::MonitorElementPtr monitorElement(this->free.front());
pva::MonitorElementPtr monitorElement(this->free.front());
if(overflow->changedBitSet->isEmpty()) {
overflow->changedBitSet->set(0); // initial update has all changed
@ -352,9 +352,9 @@ pvd::Status TestPVMonitor::stop()
return pvd::Status();
}
pvd::MonitorElementPtr TestPVMonitor::poll()
pva::MonitorElementPtr TestPVMonitor::poll()
{
pvd::MonitorElementPtr ret;
pva::MonitorElementPtr ret;
Guard G(channel->pv->provider->lock);
if(!buffer.empty()) {
ret = buffer.front();
@ -367,7 +367,7 @@ pvd::MonitorElementPtr TestPVMonitor::poll()
return ret;
}
void TestPVMonitor::release(pvd::MonitorElementPtr const & monitorElement)
void TestPVMonitor::release(pva::MonitorElementPtr const & monitorElement)
{
Guard G(channel->pv->provider->lock);
testDiag("TestPVMonitor::release %p %p", this, monitorElement.get());