group use reftrack

This commit is contained in:
Michael Davidsaver
2017-09-05 16:23:05 -05:00
parent ebfe1b715b
commit de6fcf2bbe
3 changed files with 32 additions and 5 deletions

View File

@@ -12,6 +12,9 @@ namespace pvd = epics::pvData;
namespace pva = epics::pvAccess;
size_t PDBGroupPV::num_instances;
size_t PDBGroupChannel::num_instances;
size_t PDBGroupPut::num_instances;
size_t PDBGroupMonitor::num_instances;
typedef epicsGuard<epicsMutex> Guard;
@@ -99,8 +102,6 @@ PDBGroupPV::connect(const std::tr1::shared_ptr<PDBProvider>& prov,
return ret;
}
size_t PDBGroupChannel::num_instances;
PDBGroupChannel::PDBGroupChannel(const PDBGroupPV::shared_pointer& pv,
const std::tr1::shared_ptr<pva::ChannelProvider>& prov,
const pva::ChannelRequester::shared_pointer& req)
@@ -153,6 +154,7 @@ PDBGroupPut::PDBGroupPut(const PDBGroupChannel::shared_pointer& channel,
,changed(new pvd::BitSet(channel->fielddesc->getNumberFields()))
,pvf(pvd::getPVDataCreate()->createPVStructure(channel->fielddesc))
{
epics::atomic::increment(num_instances);
pvd::PVScalarPtr atomicopt(pvReq->getSubField<pvd::PVScalar>("record._options.atomic"));
if(atomicopt) {
try {
@@ -177,6 +179,11 @@ PDBGroupPut::PDBGroupPut(const PDBGroupChannel::shared_pointer& channel,
}
}
PDBGroupPut::~PDBGroupPut()
{
epics::atomic::decrement(num_instances);
}
void PDBGroupPut::put(pvd::PVStructure::shared_pointer const & value,
pvd::BitSet::shared_pointer const & changed)
{
@@ -245,7 +252,15 @@ PDBGroupMonitor::PDBGroupMonitor(const PDBGroupPV::shared_pointer& pv,
const pvd::PVStructure::shared_pointer& pvReq)
:BaseMonitor(requester, pvReq)
,pv(pv)
{}
{
epics::atomic::increment(num_instances);
}
PDBGroupMonitor::~PDBGroupMonitor()
{
destroy();
epics::atomic::decrement(num_instances);
}
void PDBGroupMonitor::destroy()
{

View File

@@ -103,10 +103,12 @@ struct PDBGroupPut : public epics::pvAccess::ChannelPut,
epics::pvData::PVStructurePtr pvf;
std::vector<std::tr1::shared_ptr<PVIF> > pvif;
static size_t num_instances;
PDBGroupPut(const PDBGroupChannel::shared_pointer &channel,
const requester_type::weak_pointer &requester,
const epics::pvData::PVStructure::shared_pointer& pvReq);
virtual ~PDBGroupPut() {}
virtual ~PDBGroupPut();
virtual void destroy() { pvif.clear(); channel.reset(); requester.reset(); }
virtual void lock() {}
@@ -128,10 +130,12 @@ struct PDBGroupMonitor : public BaseMonitor
bool atomic;
static size_t num_instances;
PDBGroupMonitor(const PDBGroupPV::shared_pointer& pv,
const requester_type::weak_pointer& requester,
const epics::pvData::PVStructure::shared_pointer& pvReq);
virtual ~PDBGroupMonitor() {destroy();}
virtual ~PDBGroupMonitor();
virtual void onStart();
virtual void onStop();

View File

@@ -10,8 +10,10 @@
#include "pvahelper.h"
#include "iocshelper.h"
#include "pvif.h"
#include "pdb.h"
#include "pdbsingle.h"
#include "pdbgroup.h"
namespace pva = epics::pvAccess;
@@ -22,6 +24,12 @@ void QSRVRegistrar()
epics::registerRefCounter("PDBSingleChannel", &PDBSingleChannel::num_instances);
epics::registerRefCounter("PDBSinglePut", &PDBSinglePut::num_instances);
epics::registerRefCounter("PDBSingleMonitor", &PDBSingleMonitor::num_instances);
#ifdef USE_MULTILOCK
epics::registerRefCounter("PDBGroupPV", &PDBGroupPV::num_instances);
epics::registerRefCounter("PDBGroupChannel", &PDBGroupChannel::num_instances);
epics::registerRefCounter("PDBGroupPut", &PDBGroupPut::num_instances);
epics::registerRefCounter("PDBGroupMonitor", &PDBGroupMonitor::num_instances);
#endif // USE_MULTILOCK
epics::registerRefCounter("PDBProvider", &PDBProvider::num_instances);
pva::ChannelProviderRegistry::servers()->add<PDBProvider>("QSRV");
}