group use reftrack
This commit is contained in:
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user