From 58b4a5ef644b5fbb906f8072d966e6f9330d37b6 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Tue, 6 Jun 2017 10:41:36 +0200 Subject: [PATCH] ClientFactory::start() avoid custom ChannelProviderFactory --- src/pva/clientFactory.cpp | 65 +------------------------ src/remoteClient/clientContextImpl.cpp | 3 +- src/remoteClient/pv/clientContextImpl.h | 2 - 3 files changed, 3 insertions(+), 67 deletions(-) diff --git a/src/pva/clientFactory.cpp b/src/pva/clientFactory.cpp index 9075e70..6ffdbed 100644 --- a/src/pva/clientFactory.cpp +++ b/src/pva/clientFactory.cpp @@ -18,76 +18,15 @@ using namespace epics::pvData; using namespace epics::pvAccess; -class ChannelProviderFactoryImpl : public ChannelProviderFactory -{ -private: - Mutex m_mutex; - ChannelProvider::shared_pointer m_shared_provider; - -public: - POINTER_DEFINITIONS(ChannelProviderFactoryImpl); - - virtual ~ChannelProviderFactoryImpl() - { - Lock guard(m_mutex); - if (m_shared_provider) - { - ChannelProvider::shared_pointer provider; - m_shared_provider.swap(provider); - // factroy cleans up also shared provider - provider->destroy(); - } - } - - virtual std::string getFactoryName() - { - return ClientContextImpl::PROVIDER_NAME; - } - - virtual ChannelProvider::shared_pointer sharedInstance() - { - Lock guard(m_mutex); - if (!m_shared_provider) - { - epics::pvAccess::Configuration::shared_pointer def; - m_shared_provider = createClientProvider(def); - } - return m_shared_provider; - } - - virtual ChannelProvider::shared_pointer newInstance(const std::tr1::shared_ptr& conf) - { - Lock guard(m_mutex); - return createClientProvider(conf); - } -}; - -static Mutex cprovfact_mutex; -static ChannelProviderFactoryImpl::shared_pointer pva_factory; - void ClientFactory::start() { epicsSignalInstallSigAlarmIgnore(); epicsSignalInstallSigPipeIgnore(); - Lock guard(cprovfact_mutex); - if (!pva_factory) - pva_factory.reset(new ChannelProviderFactoryImpl()); - - registerChannelProviderFactory(pva_factory); + getChannelProviderRegistry()->add("pva", createClientProvider, false); } void ClientFactory::stop() { - Lock guard(cprovfact_mutex); - - if (pva_factory) - { - unregisterChannelProviderFactory(pva_factory); - if(!pva_factory.unique()) { - LOG(logLevelWarn, "ClientFactory::stop() finds shared client context with %u remaining users", - (unsigned)pva_factory.use_count()); - } - pva_factory.reset(); - } + getChannelProviderRegistry()->remove("pva"); } diff --git a/src/remoteClient/clientContextImpl.cpp b/src/remoteClient/clientContextImpl.cpp index 87ebbaa..7bd1f61 100644 --- a/src/remoteClient/clientContextImpl.cpp +++ b/src/remoteClient/clientContextImpl.cpp @@ -47,7 +47,6 @@ using namespace epics::pvData; namespace epics { namespace pvAccess { -string ClientContextImpl::PROVIDER_NAME = "pva"; Status ChannelImpl::channelDestroyed( Status::STATUSTYPE_WARNING, "channel destroyed"); Status ChannelImpl::channelDisconnected( @@ -3302,7 +3301,7 @@ public: virtual std::string getProviderName() { - return PROVIDER_NAME; + return "pva"; } virtual ChannelFind::shared_pointer channelFind( diff --git a/src/remoteClient/pv/clientContextImpl.h b/src/remoteClient/pv/clientContextImpl.h index 5d5488b..e8a802c 100644 --- a/src/remoteClient/pv/clientContextImpl.h +++ b/src/remoteClient/pv/clientContextImpl.h @@ -67,8 +67,6 @@ class ClientContextImpl : public Context public: POINTER_DEFINITIONS(ClientContextImpl); - static std::string PROVIDER_NAME; - /** * Get context implementation version. * @return version of the context implementation.