fixup testpdb

This commit is contained in:
Michael Davidsaver
2017-06-22 16:38:24 +02:00
parent ebfd980a31
commit ba485df469
5 changed files with 20 additions and 6 deletions

View File

@ -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) {

View File

@ -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

View File

@ -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

View File

@ -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();

View File

@ -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);