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); + } } }