use reftrack

This commit is contained in:
Michael Davidsaver
2017-09-05 13:40:23 -05:00
parent bf3fda4e92
commit 3f4e8e33e7
8 changed files with 73 additions and 26 deletions

View File

@@ -312,7 +312,7 @@ struct PDBProcessor
};
}
size_t PDBProvider::ninstances;
size_t PDBProvider::num_instances;
PDBProvider::PDBProvider(const epics::pvAccess::Configuration::shared_pointer &)
{
@@ -442,12 +442,12 @@ PDBProvider::PDBProvider(const epics::pvAccess::Configuration::shared_pointer &)
// TODO, remove PV and continue?
throw;
}
epics::atomic::increment(ninstances);
epics::atomic::increment(num_instances);
}
PDBProvider::~PDBProvider()
{
epics::atomic::decrement(ninstances);
epics::atomic::decrement(num_instances);
{
epicsGuard<epicsMutex> G(transient_pv_map.mutex());

View File

@@ -54,7 +54,7 @@ struct epicsShareClass PDBProvider : public epics::pvAccess::ChannelProvider,
dbEventCtx event_context;
static size_t ninstances;
static size_t num_instances;
};
#endif // PDB_H

View File

@@ -11,7 +11,7 @@
namespace pvd = epics::pvData;
namespace pva = epics::pvAccess;
size_t PDBGroupPV::ninstances;
size_t PDBGroupPV::num_instances;
typedef epicsGuard<epicsMutex> Guard;
@@ -83,12 +83,12 @@ PDBGroupPV::PDBGroupPV()
,monatomic(false)
,initial_waits(0)
{
epics::atomic::increment(ninstances);
epics::atomic::increment(num_instances);
}
PDBGroupPV::~PDBGroupPV()
{
epics::atomic::decrement(ninstances);
epics::atomic::decrement(num_instances);
}
pva::Channel::shared_pointer
@@ -99,7 +99,7 @@ PDBGroupPV::connect(const std::tr1::shared_ptr<PDBProvider>& prov,
return ret;
}
size_t PDBGroupChannel::ninstances;
size_t PDBGroupChannel::num_instances;
PDBGroupChannel::PDBGroupChannel(const PDBGroupPV::shared_pointer& pv,
const std::tr1::shared_ptr<pva::ChannelProvider>& prov,
@@ -107,12 +107,12 @@ PDBGroupChannel::PDBGroupChannel(const PDBGroupPV::shared_pointer& pv,
:BaseChannel(pv->name, prov, req, pv->fielddesc)
,pv(pv)
{
epics::atomic::increment(ninstances);
epics::atomic::increment(num_instances);
}
PDBGroupChannel::~PDBGroupChannel()
{
epics::atomic::decrement(ninstances);
epics::atomic::decrement(num_instances);
}
void PDBGroupChannel::printInfo(std::ostream& out)

View File

@@ -56,7 +56,7 @@ struct epicsShareClass PDBGroupPV : public PDBPV
interested_t interested;
size_t initial_waits;
static size_t ninstances;
static size_t num_instances;
PDBGroupPV();
virtual ~PDBGroupPV();
@@ -74,7 +74,7 @@ struct epicsShareClass PDBGroupChannel : public BaseChannel,
PDBGroupPV::shared_pointer pv;
static size_t ninstances;
static size_t num_instances;
PDBGroupChannel(const PDBGroupPV::shared_pointer& pv,
const std::tr1::shared_ptr<epics::pvAccess::ChannelProvider>& prov,

View File

@@ -12,7 +12,11 @@
namespace pvd = epics::pvData;
namespace pva = epics::pvAccess;
size_t PDBSinglePV::ninstances;
size_t PDBSinglePV::num_instances;
size_t PDBSingleChannel::num_instances;
size_t PDBSingleGet::num_instances;
size_t PDBSinglePut::num_instances;
size_t PDBSingleMonitor::num_instances;
typedef epicsGuard<epicsMutex> Guard;
@@ -73,12 +77,12 @@ PDBSinglePV::PDBSinglePV(DBCH& chan,
complete = pvd::getPVDataCreate()->createPVStructure(fielddesc);
pvif.reset(PVIF::attach(this->chan, complete));
epics::atomic::increment(ninstances);
epics::atomic::increment(num_instances);
}
PDBSinglePV::~PDBSinglePV()
{
epics::atomic::decrement(ninstances);
epics::atomic::decrement(num_instances);
}
void PDBSinglePV::activate()
@@ -101,6 +105,12 @@ PDBSingleChannel::PDBSingleChannel(const PDBSinglePV::shared_pointer& pv,
,pv(pv)
{
assert(!!this->pv);
epics::atomic::increment(num_instances);
}
PDBSingleChannel::~PDBSingleChannel()
{
epics::atomic::decrement(num_instances);
}
void PDBSingleChannel::printInfo(std::ostream& out)
@@ -149,7 +159,14 @@ PDBSingleGet::PDBSingleGet(const PDBSingleChannel::shared_pointer &channel,
,changed(new pvd::BitSet(channel->fielddesc->getNumberFields()))
,pvf(pvd::getPVDataCreate()->createPVStructure(channel->fielddesc))
,pvif(PVIF::attach(channel->pv->chan, pvf))
{}
{
epics::atomic::increment(num_instances);
}
PDBSingleGet::~PDBSingleGet()
{
epics::atomic::decrement(num_instances);
}
namespace {
void commonGet(PVIF *pvif, pvd::BitSet* changed)
@@ -188,6 +205,7 @@ PDBSinglePut::PDBSinglePut(const PDBSingleChannel::shared_pointer &channel,
,doProcForce(false)
,doWait(false)
{
epics::atomic::increment(num_instances);
dbChannel *chan = channel->pv->chan;
dbCommon *precord = dbChannelRecord(chan);
doProc = dbChannelField(chan) == &precord->proc ||
@@ -214,6 +232,11 @@ PDBSinglePut::PDBSinglePut(const PDBSingleChannel::shared_pointer &channel,
notify.usrPvt = (void*)this;
}
PDBSinglePut::~PDBSinglePut()
{
epics::atomic::decrement(num_instances);
}
void PDBSinglePut::put(pvd::PVStructure::shared_pointer const & value,
pvd::BitSet::shared_pointer const & changed)
{
@@ -277,7 +300,15 @@ PDBSingleMonitor::PDBSingleMonitor(const PDBSinglePV::shared_pointer& pv,
const pvd::PVStructure::shared_pointer& pvReq)
:BaseMonitor(requester, pvReq)
,pv(pv)
{}
{
epics::atomic::increment(num_instances);
}
PDBSingleMonitor::~PDBSingleMonitor()
{
destroy();
epics::atomic::decrement(num_instances);
}
void PDBSingleMonitor::destroy()
{

View File

@@ -45,7 +45,7 @@ struct epicsShareClass PDBSinglePV : public PDBPV
DBEvent evt_VALUE, evt_PROPERTY;
bool hadevent_VALUE, hadevent_PROPERTY;
static size_t ninstances;
static size_t num_instances;
PDBSinglePV(DBCH& chan,
const PDBProvider::shared_pointer& prov);
@@ -65,9 +65,11 @@ struct PDBSingleChannel : public BaseChannel,
PDBSinglePV::shared_pointer pv;
static size_t num_instances;
PDBSingleChannel(const PDBSinglePV::shared_pointer& pv,
const epics::pvAccess::ChannelRequester::shared_pointer& req);
virtual ~PDBSingleChannel() {}
virtual ~PDBSingleChannel();
virtual epics::pvAccess::ChannelGet::shared_pointer createChannelGet(
epics::pvAccess::ChannelGetRequester::shared_pointer const & channelGetRequester,
@@ -93,10 +95,12 @@ struct PDBSingleGet : public epics::pvAccess::ChannelGet,
epics::pvData::PVStructurePtr pvf;
std::auto_ptr<PVIF> pvif;
static size_t num_instances;
PDBSingleGet(const PDBSingleChannel::shared_pointer& channel,
const epics::pvAccess::ChannelGetRequester::shared_pointer& requester,
const epics::pvData::PVStructure::shared_pointer& pvReq);
virtual ~PDBSingleGet() {}
virtual ~PDBSingleGet();
virtual void destroy() { pvif.reset(); channel.reset(); requester.reset(); }
virtual void lock() {}
@@ -122,10 +126,12 @@ struct PDBSinglePut : public epics::pvAccess::ChannelPut,
std::tr1::shared_ptr<PDBSinglePut> procself; // make ref. loop while notify is active
static size_t num_instances;
PDBSinglePut(const PDBSingleChannel::shared_pointer& channel,
const epics::pvAccess::ChannelPutRequester::shared_pointer& requester,
const epics::pvData::PVStructure::shared_pointer& pvReq);
virtual ~PDBSinglePut() {}
virtual ~PDBSinglePut();
virtual void destroy() { pvif.reset(); channel.reset(); requester.reset(); }
virtual void lock() {}
@@ -145,10 +151,12 @@ struct PDBSingleMonitor : public BaseMonitor
PDBSinglePV::weak_pointer pv;
static size_t num_instances;
PDBSingleMonitor(const PDBSinglePV::shared_pointer& pv,
const requester_t::shared_pointer& requester,
const epics::pvData::PVStructure::shared_pointer& pvReq);
virtual ~PDBSingleMonitor() {destroy();}
virtual ~PDBSingleMonitor();
virtual void onStart();
virtual void onStop();

View File

@@ -4,18 +4,26 @@
#include <epicsExit.h>
#include <epicsThread.h>
#include <pv/reftrack.h>
#include <pv/pvAccess.h>
#include <pv/serverContext.h>
#include "pvahelper.h"
#include "iocshelper.h"
#include "pdb.h"
#include "pdbsingle.h"
namespace pva = epics::pvAccess;
static
void QSRVRegistrar()
{
epics::registerRefCounter("PDBSinglePV", &PDBSinglePV::num_instances);
epics::registerRefCounter("PDBSingleChannel", &PDBSingleChannel::num_instances);
epics::registerRefCounter("PDBSingleGet", &PDBSingleGet::num_instances);
epics::registerRefCounter("PDBSinglePut", &PDBSinglePut::num_instances);
epics::registerRefCounter("PDBSingleMonitor", &PDBSingleMonitor::num_instances);
epics::registerRefCounter("PDBProvider", &PDBProvider::num_instances);
pva::ChannelProviderRegistry::servers()->add<PDBProvider>("QSRV");
}

View File

@@ -428,10 +428,10 @@ MAIN(testpdb)
iocshCmd("stopPVAServer");
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);
testEqual(epics::atomic::get(PDBProvider::num_instances), 0u);
testEqual(epics::atomic::get(PDBGroupChannel::num_instances), 0u);
testEqual(epics::atomic::get(PDBGroupPV::num_instances), 0u);
testEqual(epics::atomic::get(PDBSinglePV::num_instances), 0u);
}catch(std::exception& e){
PRINT_EXCEPTION(e);