diff --git a/pdbApp/pdbsingle.cpp b/pdbApp/pdbsingle.cpp index 9d1d0cd..4ea08ed 100644 --- a/pdbApp/pdbsingle.cpp +++ b/pdbApp/pdbsingle.cpp @@ -168,7 +168,7 @@ void pdb_single_event(void *user_arg, struct dbChannel *chan, } else { assert(!self->inoverflow); - pvd::MonitorElementPtr elem = self->empty.front(); + pvd::MonitorElementPtr elem(self->empty.front()); elem->pvStructurePtr->copyUnchecked(*self->complete); *elem->changedBitSet = self->scratch; elem->overrunBitSet->clear(); //TODO diff --git a/testApp/testpdb.cpp b/testApp/testpdb.cpp index 78b7fd5..d3fdd0d 100644 --- a/testApp/testpdb.cpp +++ b/testApp/testpdb.cpp @@ -107,6 +107,8 @@ struct PVPut : public PVConnect struct PVMonitor : public PVConnect { + POINTER_DEFINITIONS(PVMonitor); + TestChannelMonitorRequester::shared_pointer monreq; pva::Monitor::shared_pointer mon; @@ -124,17 +126,29 @@ struct PVMonitor : public PVConnect struct Element { pva::MonitorElementPtr elem; - Element(const pva::MonitorElementPtr& e) : elem(e) {} + 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); }; - Element poll() { - return Element(mon->poll()); - } + pva::MonitorElementPtr poll() { return mon->poll(); } }; pvd::PVStructurePtr pvget(const pva::ChannelProvider::shared_pointer& prov, const char *name, @@ -280,9 +294,11 @@ void testSingleMonitor(const PDBProvider::shared_pointer& prov) testOk1(mon.monreq->waitForEvent()); testDiag("Initial event"); + PVMonitor::Element e(mon); + // TODO: correctly check the first update // no mather which DBE_* arrives first... - PVMonitor::Element e(mon.poll()); + e = mon.poll(); testOk1(!!e); while(!(e = mon.poll())) { testDiag("Wait initial event (part 2)"); @@ -297,9 +313,31 @@ void testSingleMonitor(const PDBProvider::shared_pointer& prov) e = mon.poll(); testOk1(!e); - testDiag("trigger new event"); + testDiag("trigger new VALUE event"); testdbPutFieldOk("rec1", DBR_DOUBLE, 11.0); + testDiag("Wait for event"); + mon.monreq->waitForEvent(); + + e = mon.poll(); + testOk1(!!e); + testFieldEqual(e, "value", 11.0); + + e = mon.poll(); + testOk1(!e); + + testDiag("trigger new PROPERTY event"); + testdbPutFieldOk("rec1.HOPR", DBR_DOUBLE, 50.0); + + testDiag("Wait for event"); + mon.monreq->waitForEvent(); + + e = mon.poll(); + testOk1(!!e); + testFieldEqual(e, "display.limitHigh", 50.0); + + e = mon.poll(); + testOk1(!e); } } // namespace