fixup testpdb
This commit is contained in:
@ -4,6 +4,7 @@
|
||||
|
||||
#include <errlog.h>
|
||||
#include <epicsString.h>
|
||||
#include <epicsAtomic.h>
|
||||
|
||||
#include "helper.h"
|
||||
#include "pdbsingle.h"
|
||||
@ -310,6 +311,8 @@ struct PDBProcessor
|
||||
};
|
||||
}
|
||||
|
||||
size_t PDBProvider::ninstances;
|
||||
|
||||
PDBProvider::PDBProvider()
|
||||
{
|
||||
PDBProcessor proc;
|
||||
@ -440,10 +443,12 @@ PDBProvider::PDBProvider()
|
||||
// TODO, remove PV and continue?
|
||||
throw;
|
||||
}
|
||||
epics::atomic::increment(ninstances);
|
||||
}
|
||||
|
||||
PDBProvider::~PDBProvider()
|
||||
{
|
||||
epics::atomic::decrement(ninstances);
|
||||
{
|
||||
epicsGuard<epicsMutex> G(transient_pv_map.mutex());
|
||||
if(event_context) {
|
||||
|
@ -50,6 +50,8 @@ struct PDBProvider : public epics::pvAccess::ChannelProvider,
|
||||
transient_pv_map_t transient_pv_map;
|
||||
|
||||
dbEventCtx event_context;
|
||||
|
||||
static size_t ninstances;
|
||||
};
|
||||
|
||||
#endif // PDB_H
|
||||
|
@ -431,14 +431,14 @@ struct PVIFScalarNumeric : public PVIF
|
||||
}
|
||||
}
|
||||
|
||||
virtual void get(epics::pvData::BitSet& mask) OVERRIDE FINAL
|
||||
virtual void get(const epics::pvData::BitSet& mask) OVERRIDE FINAL
|
||||
{
|
||||
#ifdef USE_LOGICAL_AND
|
||||
if(mask.logical_and(pvmeta.maskVALUE))
|
||||
getValue(pvmeta);
|
||||
#else
|
||||
pvd::BitSet temp(mask);
|
||||
mask &= pvmeta.maskVALUE;
|
||||
temp &= pvmeta.maskVALUE;
|
||||
if(!temp.isEmpty())
|
||||
getValue(pvmeta);
|
||||
#endif
|
||||
|
@ -247,7 +247,7 @@ struct PVIF {
|
||||
virtual void put(epics::pvData::BitSet& mask, unsigned dbe, db_field_log *pfl) =0;
|
||||
//! Copy from pvalue to PDB record (call dbChannelPut())
|
||||
//! caller must lock record
|
||||
virtual void get(epics::pvData::BitSet& mask) =0;
|
||||
virtual void get(const epics::pvData::BitSet& mask) =0;
|
||||
|
||||
static void Init();
|
||||
|
||||
|
@ -244,6 +244,7 @@ void testGroupPut(const PDBProvider::shared_pointer& prov)
|
||||
pvd::PVDoublePtr val(put.putval->getSubFieldT<pvd::PVDouble>("fld1.value"));
|
||||
val->put(2.0);
|
||||
put.putchanged->clear();
|
||||
// putchanged is clear, so no change
|
||||
put.put();
|
||||
|
||||
testdbGetFieldEqual("rec3", DBR_DOUBLE, 3.0);
|
||||
@ -251,13 +252,14 @@ void testGroupPut(const PDBProvider::shared_pointer& prov)
|
||||
testdbGetFieldEqual("rec3.RVAL", DBR_LONG, 30);
|
||||
testdbGetFieldEqual("rec4.RVAL", DBR_LONG, 40);
|
||||
|
||||
put.putchanged->set(val->getFieldOffset());
|
||||
val = put.putval->getSubFieldT<pvd::PVDouble>("fld3.value");
|
||||
val->put(5.0);
|
||||
put.putchanged->clear();
|
||||
// mark fld3, but still not fld1
|
||||
put.putchanged->set(val->getFieldOffset());
|
||||
put.put();
|
||||
|
||||
testdbGetFieldEqual("rec3", DBR_DOUBLE, 2.0);
|
||||
testdbGetFieldEqual("rec3", DBR_DOUBLE, 3.0);
|
||||
testdbGetFieldEqual("rec4", DBR_DOUBLE, 5.0);
|
||||
testdbGetFieldEqual("rec3.RVAL", DBR_LONG, 30);
|
||||
testdbGetFieldEqual("rec4.RVAL", DBR_LONG, 40);
|
||||
@ -429,9 +431,11 @@ void testGroupMonitorTriggers(const PDBProvider::shared_pointer& prov)
|
||||
extern "C"
|
||||
void p2pTestIoc_registerRecordDeviceDriver(struct dbBase *);
|
||||
|
||||
extern void qsrvStop();
|
||||
|
||||
MAIN(testpdb)
|
||||
{
|
||||
testPlan(139);
|
||||
testPlan(140);
|
||||
try{
|
||||
TestIOC IOC;
|
||||
|
||||
@ -460,7 +464,10 @@ MAIN(testpdb)
|
||||
testOk1(prov.unique());
|
||||
prov.reset();
|
||||
|
||||
qsrvStop();
|
||||
|
||||
testDiag("check to see that all dbChannel are closed before IOC shuts down");
|
||||
testEqual(epics::atomic::get(PDBProvider::ninstances), 0u);
|
||||
testEqual(epics::atomic::get(PDBGroupChannel::ninstances), 0u);
|
||||
testEqual(epics::atomic::get(PDBGroupPV::ninstances), 0u);
|
||||
testEqual(epics::atomic::get(PDBSinglePV::ninstances), 0u);
|
||||
|
Reference in New Issue
Block a user