use newer API
This commit is contained in:
@ -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?)
|
||||
|
@ -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());
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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());
|
||||
|
@ -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());
|
||||
|
Reference in New Issue
Block a user