diff --git a/src/server/pv/responseHandlers.h b/src/server/pv/responseHandlers.h index c391c28..d1c2b68 100644 --- a/src/server/pv/responseHandlers.h +++ b/src/server/pv/responseHandlers.h @@ -126,9 +126,6 @@ public: virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer) OVERRIDE FINAL; - -private: - std::vector _providers; }; @@ -173,10 +170,9 @@ private: class ServerCreateChannelHandler : public AbstractServerResponseHandler { public: - ServerCreateChannelHandler(ServerContextImpl::shared_pointer const & context) : - AbstractServerResponseHandler(context, "Create channel request") { - _providers = context->getChannelProviders(); - } + ServerCreateChannelHandler(ServerContextImpl::shared_pointer const & context) + :AbstractServerResponseHandler(context, "Create channel request") + {} virtual ~ServerCreateChannelHandler() {} virtual void handleResponse(osiSockAddr* responseFrom, @@ -184,10 +180,10 @@ public: std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer) OVERRIDE FINAL; private: + // Name of the magic "server" PV used to implement channelList() and server info static std::string SERVER_CHANNEL_NAME; void disconnect(Transport::shared_pointer const & transport); - std::vector _providers; }; namespace detail { diff --git a/src/server/pv/serverContextImpl.h b/src/server/pv/serverContextImpl.h index b01349e..dae5dde 100644 --- a/src/server/pv/serverContextImpl.h +++ b/src/server/pv/serverContextImpl.h @@ -129,7 +129,7 @@ public: * Get channel providers. * @return channel providers. */ - virtual std::vector& getChannelProviders() OVERRIDE FINAL; + virtual const std::vector& getChannelProviders() OVERRIDE FINAL; /** * Return true if channel provider name is provided by configuration (e.g. system env. var.). @@ -224,9 +224,7 @@ private: */ ResponseHandler::shared_pointer _responseHandler; - /** - * Channel provider. - */ + // const after loadConfiguration() std::vector _channelProviders; /** diff --git a/src/server/responseHandlers.cpp b/src/server/responseHandlers.cpp index 3251179..61319be 100644 --- a/src/server/responseHandlers.cpp +++ b/src/server/responseHandlers.cpp @@ -229,7 +229,7 @@ void ServerEchoHandler::handleResponse(osiSockAddr* responseFrom, std::string ServerSearchHandler::SUPPORTED_PROTOCOL = "tcp"; ServerSearchHandler::ServerSearchHandler(ServerContextImpl::shared_pointer const & context) : - AbstractServerResponseHandler(context, "Search request"), _providers(context->getChannelProviders()) + AbstractServerResponseHandler(context, "Search request") { // initialize random seed with some random value srand ( time(NULL) ); @@ -332,15 +332,14 @@ void ServerSearchHandler::handleResponse(osiSockAddr* responseFrom, if (allowed) { - // TODO object pool!!! + const std::vector& _providers = _context->getChannelProviders(); + int providerCount = _providers.size(); std::tr1::shared_ptr tp(new ServerChannelFindRequesterImpl(_context, providerCount)); tp->set(name, searchSequenceId, cid, responseAddress, responseRequired, false); - // TODO use std::make_shared - ChannelFindRequester::shared_pointer spr = tp; for (int i = 0; i < providerCount; i++) - _providers[i]->channelFind(name, spr); + _providers[i]->channelFind(name, tp); } } } @@ -575,7 +574,7 @@ public: PVStringArray::shared_pointer allChannelNames = result->getSubFieldT("value"); ChannelListRequesterImpl::shared_pointer listListener(new ChannelListRequesterImpl()); - std::vector& providers = m_serverContext->getChannelProviders(); + const std::vector& providers = m_serverContext->getChannelProviders(); size_t providerCount = providers.size(); for (size_t i = 0; i < providerCount; i++) @@ -763,6 +762,8 @@ void ServerCreateChannelHandler::handleResponse(osiSockAddr* responseFrom, } else { + const std::vector& _providers(_context->getChannelProviders()); + if (_providers.size() == 1) ServerChannelRequesterImpl::create(_providers[0], transport, channelName, cid, css); else diff --git a/src/server/serverContext.cpp b/src/server/serverContext.cpp index aa72bbe..70135e2 100644 --- a/src/server/serverContext.cpp +++ b/src/server/serverContext.cpp @@ -502,7 +502,7 @@ BlockingUDPTransport::shared_pointer ServerContextImpl::getBroadcastTransport() return _broadcastTransport; } -std::vector& ServerContextImpl::getChannelProviders() +const std::vector& ServerContextImpl::getChannelProviders() { return _channelProviders; }