add reftrack to pvac

This commit is contained in:
Michael Davidsaver
2017-11-22 12:32:38 -06:00
parent 3f51c74ba1
commit 250826ffb9
6 changed files with 109 additions and 11 deletions

View File

@@ -8,10 +8,11 @@
#include <pv/pvData.h>
#include <pv/bitSet.h>
#include <pv/reftrack.h>
#define epicsExportSharedSymbols
#include "pv/logger.h"
#include "pva/client.h"
#include "clientpvt.h"
#include "pv/pvAccess.h"
#include "pv/configuration.h"
@@ -34,7 +35,10 @@ struct ClientChannel::Impl : public pva::ChannelRequester
typedef std::vector<ClientChannel::ConnectCallback*> listeners_t;
listeners_t listeners;
virtual ~Impl() {}
static size_t num_instances;
Impl() {REFTRACE_INCREMENT(num_instances);}
virtual ~Impl() {REFTRACE_DECREMENT(num_instances);}
virtual std::string getRequesterName() OVERRIDE FINAL { return "ClientChannel::Impl"; }
@@ -68,6 +72,8 @@ struct ClientChannel::Impl : public pva::ChannelRequester
}
};
size_t ClientChannel::Impl::num_instances;
ClientChannel::Options::Options()
:priority(0)
,address()
@@ -151,12 +157,29 @@ void ClientChannel::removeConnectListener(ConnectCallback* cb)
}
}
static
void register_reftrack()
{
static volatile int done;
if(done) return;
done = 1;
// done is an optimization, duplicate calls to registerRef* are no-ops
pvac::detail::registerRefTrack();
pvac::detail::registerRefTrackGet();
pvac::detail::registerRefTrackMonitor();
pvac::detail::registerRefTrackRPC();
}
std::tr1::shared_ptr<epics::pvAccess::Channel>
ClientChannel::getChannel()
{ return impl->channel; }
struct ClientProvider::Impl
{
static size_t num_instances;
Impl() {register_reftrack(); REFTRACE_INCREMENT(num_instances);}
~Impl() {REFTRACE_DECREMENT(num_instances);}
pva::ChannelProvider::shared_pointer provider;
epicsMutex mutex;
@@ -164,6 +187,8 @@ struct ClientProvider::Impl
channels_t channels;
};
size_t ClientProvider::Impl::num_instances;
ClientProvider::ClientProvider(const std::string& providerName,
const std::tr1::shared_ptr<epics::pvAccess::Configuration>& conf)
:impl(new Impl)
@@ -240,4 +265,14 @@ void ClientProvider::disconnect()
impl->channels.clear();
}
namespace detail {
void registerRefTrack()
{
epics::registerRefCounter("pvac::ClientChannel::Impl", &ClientChannel::Impl::num_instances);
epics::registerRefCounter("pvac::ClientProvider::Impl", &ClientProvider::Impl::num_instances);
}
}
} //namespace pvac