diff --git a/src/client/pv/pvAccess.h b/src/client/pv/pvAccess.h index 1515a4e..b17e08e 100644 --- a/src/client/pv/pvAccess.h +++ b/src/client/pv/pvAccess.h @@ -152,7 +152,10 @@ struct epicsShareClass ChannelBaseRequester : virtual public epics::pvData::Requ { POINTER_DEFINITIONS(ChannelBaseRequester); - virtual ~ChannelBaseRequester() {} + static size_t num_instances; + + ChannelBaseRequester(); + virtual ~ChannelBaseRequester(); /** Notification when underlying Channel becomes DISCONNECTED or DESTORYED * @@ -167,6 +170,10 @@ struct epicsShareClass ChannelBaseRequester : virtual public epics::pvData::Requ * @param destroy true for final disconnect. */ virtual void channelDisconnect(bool destroy) {} + +private: + ChannelBaseRequester(const ChannelBaseRequester&); + ChannelBaseRequester& operator=(const ChannelBaseRequester&); }; /** @@ -176,7 +183,10 @@ class epicsShareClass ChannelRequest : public virtual Destroyable, public Lockab public: POINTER_DEFINITIONS(ChannelRequest); - virtual ~ChannelRequest() {} + static size_t num_instances; + + ChannelRequest(); + virtual ~ChannelRequest(); /** * Get a channel instance this request belongs to. @@ -199,6 +209,10 @@ public: * When last request will be completed (regardless of completion status) the remote and local instance will be destroyed. */ virtual void lastRequest() = 0; + +private: + ChannelRequest(const ChannelRequest&); + ChannelRequest& operator=(const ChannelRequest&); }; /** @@ -1051,7 +1065,10 @@ public: * * See ChannelProvider::createChannel() */ -class epicsShareClass ChannelRequester : public virtual Requester { +class epicsShareClass ChannelRequester : public virtual Requester +{ + ChannelRequester(const ChannelRequester&); + ChannelRequester& operator=(const ChannelRequester&); public: POINTER_DEFINITIONS(ChannelRequester); typedef Channel operation_type; @@ -1117,7 +1134,10 @@ enum FlushStrategy { * * Uniquely configurable (via ChannelProviderFactory::newInstance(Configuration*) */ -class epicsShareClass ChannelProvider : public Destroyable, private epics::pvData::NoDefaultMethods { +class epicsShareClass ChannelProvider : public Destroyable, private epics::pvData::NoDefaultMethods +{ + ChannelProvider(const ChannelProvider&); + ChannelProvider& operator=(const ChannelProvider&); public: POINTER_DEFINITIONS(ChannelProvider); @@ -1134,7 +1154,10 @@ public: /** OPI priority. */ static const short PRIORITY_OPI = PRIORITY_MIN; - virtual ~ChannelProvider() {} + static size_t num_instances; + + ChannelProvider(); + virtual ~ChannelProvider(); /** * Get the provider name. diff --git a/src/client/pvAccess.cpp b/src/client/pvAccess.cpp index c585ffb..63575b0 100644 --- a/src/client/pvAccess.cpp +++ b/src/client/pvAccess.cpp @@ -120,6 +120,41 @@ ChannelArray::shared_pointer Channel::createChannelArray( return ret; } +size_t ChannelProvider::num_instances; + +ChannelProvider::ChannelProvider() +{ + REFTRACE_INCREMENT(num_instances); +} + +ChannelProvider::~ChannelProvider() +{ + REFTRACE_DECREMENT(num_instances); +} + +size_t ChannelBaseRequester::num_instances; + +ChannelBaseRequester::ChannelBaseRequester() +{ + REFTRACE_INCREMENT(num_instances); +} + +ChannelBaseRequester::~ChannelBaseRequester() +{ + REFTRACE_DECREMENT(num_instances); +} + +size_t ChannelRequest::num_instances; + +ChannelRequest::ChannelRequest() +{ + REFTRACE_INCREMENT(num_instances); +} + +ChannelRequest::~ChannelRequest() +{ + REFTRACE_DECREMENT(num_instances); +} size_t ChannelRequester::num_instances; diff --git a/src/factory/ChannelAccessFactory.cpp b/src/factory/ChannelAccessFactory.cpp index cd6a40d..42d4ee3 100644 --- a/src/factory/ChannelAccessFactory.cpp +++ b/src/factory/ChannelAccessFactory.cpp @@ -20,6 +20,7 @@ #include #include "pv/codec.h" #include +#include using namespace epics::pvData; using std::string; @@ -160,9 +161,14 @@ epicsThreadOnceId providerRegOnce = EPICS_THREAD_ONCE_INIT; void providerRegInit(void*) { providerRegGbl = new providerRegGbl_t; - registerRefCounter("ServerContext (PVA)", &ServerContextImpl::num_instances); + registerRefCounter("ServerContextImpl", &ServerContextImpl::num_instances); + registerRefCounter("ServerChannelImpl", &ServerChannelImpl::num_instances); registerRefCounter("BlockingTCPTransportCodec", &detail::BlockingTCPTransportCodec::num_instances); - registerRefCounter("ChannelRequester", &ChannelRequester::num_instances); + registerRefCounter("ChannelProvider (ABC)", &ChannelProvider::num_instances); + registerRefCounter("ChannelRequester (ABC)", &ChannelRequester::num_instances); + registerRefCounter("ChannelBaseRequester (ABC)", &ChannelBaseRequester::num_instances); + registerRefCounter("ChannelRequest (ABC)", &ChannelRequest::num_instances); + registerRefCounter("ResponseHandler (ABC)", &ResponseHandler::num_instances); } } // namespace diff --git a/src/remote/abstractResponseHandler.cpp b/src/remote/abstractResponseHandler.cpp index 14d349e..84b7634 100644 --- a/src/remote/abstractResponseHandler.cpp +++ b/src/remote/abstractResponseHandler.cpp @@ -9,6 +9,7 @@ #include #include +#include #define epicsExportSharedSymbols #include @@ -22,6 +23,18 @@ using namespace epics::pvData; namespace epics { namespace pvAccess { +size_t ResponseHandler::num_instances; + +ResponseHandler::ResponseHandler() +{ + REFTRACE_INCREMENT(num_instances); +} + +ResponseHandler::~ResponseHandler() +{ + REFTRACE_DECREMENT(num_instances); +} + void AbstractResponseHandler::handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, size_t payloadSize, ByteBuffer* payloadBuffer) { diff --git a/src/remote/pv/remote.h b/src/remote/pv/remote.h index 5407d0e..8c94213 100644 --- a/src/remote/pv/remote.h +++ b/src/remote/pv/remote.h @@ -356,7 +356,10 @@ class ResponseHandler { public: POINTER_DEFINITIONS(ResponseHandler); - virtual ~ResponseHandler() {} + static size_t num_instances; + + ResponseHandler(); + virtual ~ResponseHandler(); /** * Handle response. diff --git a/src/server/pv/serverChannelImpl.h b/src/server/pv/serverChannelImpl.h index 8add5e1..e219699 100644 --- a/src/server/pv/serverChannelImpl.h +++ b/src/server/pv/serverChannelImpl.h @@ -20,6 +20,8 @@ class ServerChannelImpl : public ServerChannel public: POINTER_DEFINITIONS(ServerChannelImpl); + static size_t num_instances; + /** * Create server channel for given process variable. * @param channel local channel. diff --git a/src/server/serverChannelImpl.cpp b/src/server/serverChannelImpl.cpp index 1abea68..932b3a7 100644 --- a/src/server/serverChannelImpl.cpp +++ b/src/server/serverChannelImpl.cpp @@ -4,6 +4,8 @@ * in file LICENSE that is included with this distribution. */ +#include + #define epicsExportSharedSymbols #include @@ -12,6 +14,8 @@ using namespace epics::pvData; namespace epics { namespace pvAccess { +size_t ServerChannelImpl::num_instances; + ServerChannelImpl::ServerChannelImpl(Channel::shared_pointer const & channel, const ChannelRequester::shared_pointer &requester, pvAccessID cid, pvAccessID sid, @@ -23,6 +27,7 @@ ServerChannelImpl::ServerChannelImpl(Channel::shared_pointer const & channel, _destroyed(false), _channelSecuritySession(css) { + REFTRACE_INCREMENT(num_instances); if (!channel.get()) { THROW_BASE_EXCEPTION("non-null channel required"); @@ -109,6 +114,7 @@ void ServerChannelImpl::destroy() ServerChannelImpl::~ServerChannelImpl() { destroy(); + REFTRACE_DECREMENT(num_instances); } void ServerChannelImpl::printInfo()