From 12e7b7864bad400f5c677052a8c946fd20080739 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 18 May 2018 17:04:07 -0700 Subject: [PATCH] fix s_channelNameToProvider hack Move from global to ServerContext, apply lock, and properly test if no provider has claimed, eg an attempt at unadvertised PV (still wouldn't work, but at least wouldn't crash). --- src/server/pv/responseHandlers.h | 3 --- src/server/pv/serverContextImpl.h | 5 +++++ src/server/responseHandlers.cpp | 18 +++++++++++++----- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/server/pv/responseHandlers.h b/src/server/pv/responseHandlers.h index c7cb4ed..a302cc7 100644 --- a/src/server/pv/responseHandlers.h +++ b/src/server/pv/responseHandlers.h @@ -115,9 +115,6 @@ private: class ServerSearchHandler : public AbstractServerResponseHandler { public: - // TODO - static std::map > s_channelNameToProvider; - static const std::string SUPPORTED_PROTOCOL; ServerSearchHandler(ServerContextImpl::shared_pointer const & context); diff --git a/src/server/pv/serverContextImpl.h b/src/server/pv/serverContextImpl.h index 32f626d..3bef569 100644 --- a/src/server/pv/serverContextImpl.h +++ b/src/server/pv/serverContextImpl.h @@ -137,6 +137,9 @@ public: */ bool isChannelProviderNamePreconfigured(); + // used by ServerChannelFindRequesterImpl + typedef std::map > s_channelNameToProvider_t; + s_channelNameToProvider_t s_channelNameToProvider; private: /** @@ -218,7 +221,9 @@ private: // const after loadConfiguration() std::vector _channelProviders; +public: epics::pvData::Mutex _mutex; +private: epics::pvData::Event _runEvent; diff --git a/src/server/responseHandlers.cpp b/src/server/responseHandlers.cpp index e529b9f..b6adda1 100644 --- a/src/server/responseHandlers.cpp +++ b/src/server/responseHandlers.cpp @@ -400,8 +400,6 @@ ServerChannelFindRequesterImpl* ServerChannelFindRequesterImpl::set(std::string return this; } -std::map > ServerSearchHandler::s_channelNameToProvider; - void ServerChannelFindRequesterImpl::channelFindResult(const Status& /*status*/, ChannelFind::shared_pointer const & channelFind, bool wasFound) { // TODO status @@ -427,7 +425,8 @@ void ServerChannelFindRequesterImpl::channelFindResult(const Status& /*status*/, { if (wasFound && _expectedResponseCount > 1) { - ServerSearchHandler::s_channelNameToProvider[_name] = channelFind->getChannelProvider(); + Lock L(_context->_mutex); + _context->s_channelNameToProvider[_name] = channelFind->getChannelProvider(); } _wasFound = wasFound; @@ -760,11 +759,20 @@ void ServerCreateChannelHandler::handleResponse(osiSockAddr* responseFrom, else { const std::vector& _providers(_context->getChannelProviders()); + ServerContextImpl::s_channelNameToProvider_t::const_iterator it; if (_providers.size() == 1) ServerChannelRequesterImpl::create(_providers[0], transport, channelName, cid, css); - else - ServerChannelRequesterImpl::create(ServerSearchHandler::s_channelNameToProvider[channelName].lock(), transport, channelName, cid, css); // TODO !!!! + else { + ChannelProvider::shared_pointer prov; + { + Lock L(_context->_mutex); + if((it = _context->s_channelNameToProvider.find(channelName)) != _context->s_channelNameToProvider.end()) + prov = it->second.lock(); + } + if(prov) + ServerChannelRequesterImpl::create(prov, transport, channelName, cid, css); + } } }