From d139c42d170ca259cb3e59675c62c90e2ec23cd2 Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Thu, 10 Mar 2016 10:26:33 +0100 Subject: [PATCH] destruction of shared provider --- src/factory/ChannelAccessFactory.cpp | 44 +++++++++++++++------------- src/pva/clientFactory.cpp | 12 ++++++++ 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/src/factory/ChannelAccessFactory.cpp b/src/factory/ChannelAccessFactory.cpp index df68e53..299d966 100644 --- a/src/factory/ChannelAccessFactory.cpp +++ b/src/factory/ChannelAccessFactory.cpp @@ -32,30 +32,32 @@ static ChannelProviderFactoryMap channelProviders; class ChannelProviderRegistryImpl : public ChannelProviderRegistry { public: - ChannelProvider::shared_pointer getProvider(std::string const & _providerName) { - - // TODO remove, here for backward compatibility - const string providerName = (_providerName == "pvAccess") ? "pva" : _providerName; - - Lock guard(channelProviderMutex); - ChannelProviderFactoryMap::const_iterator iter = channelProviders.find(providerName); - if (iter != channelProviders.end()) - return iter->second->sharedInstance(); - else - return ChannelProvider::shared_pointer(); + ChannelProvider::shared_pointer getProvider(std::string const & providerName) { + + ChannelProviderFactory::shared_pointer providerFactory; + { + Lock guard(channelProviderMutex); + ChannelProviderFactoryMap::const_iterator iter = channelProviders.find(providerName); + if (iter == channelProviders.end()) + return ChannelProvider::shared_pointer(); + else + providerFactory = iter->second; + } + return providerFactory->sharedInstance(); } - ChannelProvider::shared_pointer createProvider(std::string const & _providerName) { + ChannelProvider::shared_pointer createProvider(std::string const & providerName) { - // TODO remove, here for backward compatibility - const string providerName = (_providerName == "pvAccess") ? "pva" : _providerName; - - Lock guard(channelProviderMutex); - ChannelProviderFactoryMap::const_iterator iter = channelProviders.find(providerName); - if (iter != channelProviders.end()) - return iter->second->newInstance(); - else - return ChannelProvider::shared_pointer(); + ChannelProviderFactory::shared_pointer providerFactory; + { + Lock guard(channelProviderMutex); + ChannelProviderFactoryMap::const_iterator iter = channelProviders.find(providerName); + if (iter == channelProviders.end()) + return ChannelProvider::shared_pointer(); + else + providerFactory = iter->second; + } + return providerFactory->newInstance(); } std::auto_ptr getProviderNames() { diff --git a/src/pva/clientFactory.cpp b/src/pva/clientFactory.cpp index dfdfb56..a28f234 100644 --- a/src/pva/clientFactory.cpp +++ b/src/pva/clientFactory.cpp @@ -24,6 +24,18 @@ class ChannelProviderFactoryImpl : public ChannelProviderFactory public: POINTER_DEFINITIONS(ChannelProviderFactoryImpl); + virtual ~ChannelProviderFactoryImpl() + { + Lock guard(cfact_mutex); + if (cfact_shared_provider) + { + ChannelProvider::shared_pointer provider; + cfact_shared_provider.swap(provider); + // factroy cleans up also shared provider + provider->destroy(); + } + } + virtual std::string getFactoryName() { return ClientContextImpl::PROVIDER_NAME;