From 125822d18f9a05d8e183ac409ca6711f633b479f Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Thu, 17 Dec 2015 09:12:33 +0100 Subject: [PATCH] one instance of responseHandler per context --- src/remote/blockingTCP.h | 20 +++++--------------- src/remote/blockingTCPAcceptor.cpp | 11 +++++------ src/remote/blockingTCPConnector.cpp | 2 +- src/remote/blockingUDP.h | 8 ++++---- src/remote/blockingUDPConnector.cpp | 2 +- src/remote/blockingUDPTransport.cpp | 2 +- src/remote/codec.cpp | 4 ++-- src/remote/codec.h | 12 ++++++------ src/remote/remote.h | 2 +- src/remoteClient/clientContextImpl.cpp | 17 ++++++++++------- src/server/serverContext.cpp | 20 ++++++-------------- src/server/serverContext.h | 9 ++++++--- testApp/remote/testServer.cpp | 1 + 13 files changed, 49 insertions(+), 61 deletions(-) diff --git a/src/remote/blockingTCP.h b/src/remote/blockingTCP.h index 6c03793..1237f16 100644 --- a/src/remote/blockingTCP.h +++ b/src/remote/blockingTCP.h @@ -58,7 +58,7 @@ namespace epics { virtual ~BlockingTCPConnector(); virtual Transport::shared_pointer connect(TransportClient::shared_pointer const & client, - std::auto_ptr& responseHandler, osiSockAddr& address, + ResponseHandler::shared_pointer const & responseHandler, osiSockAddr& address, epics::pvData::int8 transportRevision, epics::pvData::int16 priority); private: /** @@ -97,16 +97,6 @@ namespace epics { }; - class ResponseHandlerFactory - { - public: - POINTER_DEFINITIONS(ResponseHandlerFactory); - - virtual ~ResponseHandlerFactory() {}; - - virtual std::auto_ptr createResponseHandler() = 0; - }; - /** * Channel Access Server TCP acceptor. * @author Matej Sekoranja @@ -123,10 +113,10 @@ namespace epics { * @throws PVAException */ BlockingTCPAcceptor(Context::shared_pointer const & context, - ResponseHandlerFactory::shared_pointer const & responseHandlerFactory, + ResponseHandler::shared_pointer const & responseHandler, int port, int receiveBufferSize); BlockingTCPAcceptor(Context::shared_pointer const & context, - ResponseHandlerFactory::shared_pointer const & responseHandlerFactory, + ResponseHandler::shared_pointer const & responseHandler, const osiSockAddr& addr, int receiveBufferSize); virtual ~BlockingTCPAcceptor(); @@ -153,9 +143,9 @@ namespace epics { Context::shared_pointer _context; /** - * ResponseHandler factory. + * Response handler. */ - ResponseHandlerFactory::shared_pointer _responseHandlerFactory; + ResponseHandler::shared_pointer _responseHandler; /** * Bind server socket address. diff --git a/src/remote/blockingTCPAcceptor.cpp b/src/remote/blockingTCPAcceptor.cpp index 565e65c..72e4315 100644 --- a/src/remote/blockingTCPAcceptor.cpp +++ b/src/remote/blockingTCPAcceptor.cpp @@ -24,11 +24,11 @@ namespace pvAccess { BlockingTCPAcceptor::BlockingTCPAcceptor( Context::shared_pointer const & context, - ResponseHandlerFactory::shared_pointer const & responseHandlerFactory, + ResponseHandler::shared_pointer const & responseHandler, int port, int receiveBufferSize) : _context(context), - _responseHandlerFactory(responseHandlerFactory), + _responseHandler(responseHandler), _bindAddress(), _serverSocketChannel(INVALID_SOCKET), _receiveBufferSize(receiveBufferSize), @@ -45,10 +45,10 @@ namespace pvAccess { } BlockingTCPAcceptor::BlockingTCPAcceptor(Context::shared_pointer const & context, - ResponseHandlerFactory::shared_pointer const & responseHandlerFactory, + ResponseHandler::shared_pointer const & responseHandler, const osiSockAddr& addr, int receiveBufferSize) : _context(context), - _responseHandlerFactory(responseHandlerFactory), + _responseHandler(responseHandler), _bindAddress(), _serverSocketChannel(INVALID_SOCKET), _receiveBufferSize(receiveBufferSize), @@ -207,12 +207,11 @@ namespace pvAccess { /** * Create transport, it registers itself to the registry. */ - std::auto_ptr responseHandler = _responseHandlerFactory->createResponseHandler(); detail::BlockingServerTCPTransportCodec::shared_pointer transport = detail::BlockingServerTCPTransportCodec::create( _context, newClient, - responseHandler, + _responseHandler, _socketSendBufferSize, _receiveBufferSize); diff --git a/src/remote/blockingTCPConnector.cpp b/src/remote/blockingTCPConnector.cpp index 87711f1..935160e 100644 --- a/src/remote/blockingTCPConnector.cpp +++ b/src/remote/blockingTCPConnector.cpp @@ -68,7 +68,7 @@ namespace epics { } Transport::shared_pointer BlockingTCPConnector::connect(TransportClient::shared_pointer const & client, - std::auto_ptr& responseHandler, osiSockAddr& address, + ResponseHandler::shared_pointer const & responseHandler, osiSockAddr& address, int8 transportRevision, int16 priority) { SOCKET socket = INVALID_SOCKET; diff --git a/src/remote/blockingUDP.h b/src/remote/blockingUDP.h index 682ccec..7feca9f 100644 --- a/src/remote/blockingUDP.h +++ b/src/remote/blockingUDP.h @@ -47,12 +47,12 @@ namespace epics { POINTER_DEFINITIONS(BlockingUDPTransport); BlockingUDPTransport(bool serverFlag, - std::auto_ptr &responseHandler, + ResponseHandler::shared_pointer const & responseHandler, SOCKET channel, osiSockAddr &bindAddress, short remoteTransportRevision); static shared_pointer create(bool serverFlag, - std::auto_ptr& responseHandler, + ResponseHandler::shared_pointer const & responseHandler, SOCKET channel, osiSockAddr& bindAddress, short remoteTransportRevision) EPICS_DEPRECATED { @@ -314,7 +314,7 @@ namespace epics { /** * Response handler. */ - const std::auto_ptr _responseHandler; + ResponseHandler::shared_pointer _responseHandler; virtual void run(); @@ -419,7 +419,7 @@ namespace epics { * NOTE: transport client is ignored for broadcast (UDP). */ virtual Transport::shared_pointer connect(TransportClient::shared_pointer const & client, - std::auto_ptr& responseHandler, osiSockAddr& bindAddress, + ResponseHandler::shared_pointer const & responseHandler, osiSockAddr& bindAddress, epics::pvData::int8 transportRevision, epics::pvData::int16 priority); private: diff --git a/src/remote/blockingUDPConnector.cpp b/src/remote/blockingUDPConnector.cpp index 676ce47..7bb8a01 100644 --- a/src/remote/blockingUDPConnector.cpp +++ b/src/remote/blockingUDPConnector.cpp @@ -19,7 +19,7 @@ namespace epics { namespace pvAccess { Transport::shared_pointer BlockingUDPConnector::connect(TransportClient::shared_pointer const & /*client*/, - auto_ptr& responseHandler, osiSockAddr& bindAddress, + ResponseHandler::shared_pointer const & responseHandler, osiSockAddr& bindAddress, int8 transportRevision, int16 /*priority*/) { LOG(logLevelDebug, "Creating datagram socket to: %s.", diff --git a/src/remote/blockingUDPTransport.cpp b/src/remote/blockingUDPTransport.cpp index 7caa4a4..c43d58e 100644 --- a/src/remote/blockingUDPTransport.cpp +++ b/src/remote/blockingUDPTransport.cpp @@ -41,7 +41,7 @@ inline int sendto(int s, const char *buf, size_t len, int flags, const struct so PVACCESS_REFCOUNT_MONITOR_DEFINE(blockingUDPTransport); BlockingUDPTransport::BlockingUDPTransport(bool serverFlag, - auto_ptr& responseHandler, SOCKET channel, + ResponseHandler::shared_pointer const & responseHandler, SOCKET channel, osiSockAddr& bindAddress, short /*remoteTransportRevision*/) : _closed(), diff --git a/src/remote/codec.cpp b/src/remote/codec.cpp index f886c0a..83fdfdb 100644 --- a/src/remote/codec.cpp +++ b/src/remote/codec.cpp @@ -1442,7 +1442,7 @@ namespace epics { BlockingServerTCPTransportCodec::BlockingServerTCPTransportCodec( Context::shared_pointer const & context, SOCKET channel, - std::auto_ptr& responseHandler, + ResponseHandler::shared_pointer const & responseHandler, int32_t sendBufferSize, int32_t receiveBufferSize) : BlockingTCPTransportCodec(true, context, channel, responseHandler, @@ -1702,7 +1702,7 @@ namespace epics { BlockingClientTCPTransportCodec::BlockingClientTCPTransportCodec( Context::shared_pointer const & context, SOCKET channel, - std::auto_ptr& responseHandler, + ResponseHandler::shared_pointer const & responseHandler, int32_t sendBufferSize, int32_t receiveBufferSize, TransportClient::shared_pointer const & client, diff --git a/src/remote/codec.h b/src/remote/codec.h index 07a7410..b9371ce 100644 --- a/src/remote/codec.h +++ b/src/remote/codec.h @@ -481,7 +481,7 @@ namespace epics { bool serverFlag, Context::shared_pointer const & context, SOCKET channel, - std::auto_ptr& responseHandler, + ResponseHandler::shared_pointer const & responseHandler, int32_t sendBufferSize, int32_t receiveBufferSize, epics::pvData::int16 priority @@ -505,7 +505,7 @@ namespace epics { private: - std::auto_ptr _responseHandler; + ResponseHandler::shared_pointer _responseHandler; size_t _remoteTransportReceiveBufferSize; epics::pvData::int8 _remoteTransportRevision; epics::pvData::int16 _priority; @@ -529,7 +529,7 @@ namespace epics { BlockingServerTCPTransportCodec( Context::shared_pointer const & context, SOCKET channel, - std::auto_ptr& responseHandler, + ResponseHandler::shared_pointer const & responseHandler, int32_t sendBufferSize, int32_t receiveBufferSize ); @@ -537,7 +537,7 @@ namespace epics { static shared_pointer create( Context::shared_pointer const & context, SOCKET channel, - std::auto_ptr& responseHandler, + ResponseHandler::shared_pointer const & responseHandler, int sendBufferSize, int receiveBufferSize) { @@ -658,7 +658,7 @@ namespace epics { BlockingClientTCPTransportCodec( Context::shared_pointer const & context, SOCKET channel, - std::auto_ptr& responseHandler, + ResponseHandler::shared_pointer const & responseHandler, int32_t sendBufferSize, int32_t receiveBufferSize, TransportClient::shared_pointer const & client, @@ -670,7 +670,7 @@ namespace epics { static shared_pointer create( Context::shared_pointer const & context, SOCKET channel, - std::auto_ptr& responseHandler, + ResponseHandler::shared_pointer const & responseHandler, int32_t sendBufferSize, int32_t receiveBufferSize, TransportClient::shared_pointer const & client, diff --git a/src/remote/remote.h b/src/remote/remote.h index c05306e..acb3a9c 100644 --- a/src/remote/remote.h +++ b/src/remote/remote.h @@ -460,7 +460,7 @@ namespace epics { * @return transport instance. */ virtual Transport::shared_pointer connect(TransportClient::shared_pointer const & client, - std::auto_ptr& responseHandler, osiSockAddr& address, + ResponseHandler::shared_pointer const & responseHandler, osiSockAddr& address, epics::pvData::int8 transportRevision, epics::pvData::int16 priority) = 0; }; diff --git a/src/remoteClient/clientContextImpl.cpp b/src/remoteClient/clientContextImpl.cpp index 135d371..1810b98 100644 --- a/src/remoteClient/clientContextImpl.cpp +++ b/src/remoteClient/clientContextImpl.cpp @@ -4436,6 +4436,8 @@ namespace epics { m_connector.reset(new BlockingTCPConnector(thisPointer, m_receiveBufferSize, m_connectionTimeout)); m_transportRegistry.reset(new TransportRegistry()); + m_responseHandler.reset(new ClientResponseHandler(shared_from_this())); + // preinitialize security plugins SecurityPluginRegistry::instance(); @@ -4494,10 +4496,9 @@ namespace epics { TransportClient::shared_pointer nullTransportClient; - auto_ptr clientResponseHandler(new ClientResponseHandler(thisPointer)); auto_ptr broadcastConnector(new BlockingUDPConnector(false, true, true)); m_broadcastTransport = static_pointer_cast(broadcastConnector->connect( - nullTransportClient, clientResponseHandler, + nullTransportClient, m_responseHandler, listenLocalAddress, PVA_PROTOCOL_REVISION, PVA_DEFAULT_PRIORITY)); if (!m_broadcastTransport.get()) @@ -4510,10 +4511,9 @@ namespace epics { undefinedAddress.ia.sin_port = htons(0); undefinedAddress.ia.sin_addr.s_addr = htonl(INADDR_ANY); - clientResponseHandler.reset(new ClientResponseHandler(thisPointer)); auto_ptr searchConnector(new BlockingUDPConnector(false, false, true)); m_searchTransport = static_pointer_cast(searchConnector->connect( - nullTransportClient, clientResponseHandler, + nullTransportClient, m_responseHandler, undefinedAddress, PVA_PROTOCOL_REVISION, PVA_DEFAULT_PRIORITY)); if (!m_searchTransport.get()) @@ -4795,9 +4795,7 @@ namespace epics { { try { - // TODO we are creating a new response handler even-though we might not need a new transprot !!! - auto_ptr handler(new ClientResponseHandler(shared_from_this())); - Transport::shared_pointer t = m_connector->connect(client, handler, *serverAddress, minorRevision, priority); + Transport::shared_pointer t = m_connector->connect(client, m_responseHandler, *serverAddress, minorRevision, priority); // TODO !!! //static_pointer_cast(t)->setFlushStrategy(m_flushStrategy); return t; @@ -4988,6 +4986,11 @@ namespace epics { */ TransportRegistry::shared_pointer m_transportRegistry; + /** + * Response handler. + */ + ClientResponseHandler::shared_pointer m_responseHandler; + /** * Context instance. */ diff --git a/src/server/serverContext.cpp b/src/server/serverContext.cpp index 6ec64dc..3d44491 100644 --- a/src/server/serverContext.cpp +++ b/src/server/serverContext.cpp @@ -252,12 +252,6 @@ void ServerContextImpl::initialize(ChannelProviderRegistry::shared_pointer const _state = INITIALIZED; } -std::auto_ptr ServerContextImpl::createResponseHandler() -{ - ServerContextImpl::shared_pointer thisContext = shared_from_this(); - return std::auto_ptr(new ServerResponseHandler(thisContext)); -} - void ServerContextImpl::internalInitialize() { osiSockAttach(); @@ -266,8 +260,9 @@ void ServerContextImpl::internalInitialize() _transportRegistry.reset(new TransportRegistry()); ServerContextImpl::shared_pointer thisServerContext = shared_from_this(); + _responseHandler.reset(new ServerResponseHandler(thisServerContext)); - _acceptor.reset(new BlockingTCPAcceptor(thisServerContext, thisServerContext, _ifaceAddr, _receiveBufferSize)); + _acceptor.reset(new BlockingTCPAcceptor(thisServerContext, _responseHandler, _ifaceAddr, _receiveBufferSize)); _serverPort = ntohs(_acceptor->getBindAddress()->ia.sin_port); // setup broadcast UDP transport @@ -300,9 +295,8 @@ void ServerContextImpl::initializeBroadcastTransport() TransportClient::shared_pointer nullTransportClient; auto_ptr broadcastConnector(new BlockingUDPConnector(true, true, true)); - auto_ptr responseHandler = createResponseHandler(); _broadcastTransport = static_pointer_cast(broadcastConnector->connect( - nullTransportClient, responseHandler, + nullTransportClient, _responseHandler, listenLocalAddress, PVA_PROTOCOL_REVISION, PVA_DEFAULT_PRIORITY)); listenLocalAddress = *_broadcastTransport->getRemoteAddress(); @@ -323,9 +317,8 @@ void ServerContextImpl::initializeBroadcastTransport() */ _ifaceBCast.ia.sin_port = listenLocalAddress.ia.sin_port; - responseHandler = createResponseHandler(); _broadcastTransport2 = static_pointer_cast(broadcastConnector->connect( - nullTransportClient, responseHandler, + nullTransportClient, _responseHandler, _ifaceBCast, PVA_PROTOCOL_REVISION, PVA_DEFAULT_PRIORITY)); /* The other wrinkle is that nothing should be sent from this second @@ -382,9 +375,8 @@ void ServerContextImpl::initializeBroadcastTransport() anyAddress.ia.sin_addr.s_addr = htonl(INADDR_ANY); // NOTE: localMulticastTransport is not started (no read is called on a socket) - auto_ptr responseHandler2 = createResponseHandler(); _localMulticastTransport = static_pointer_cast(broadcastConnector->connect( - nullTransportClient, responseHandler2, + nullTransportClient, _responseHandler, anyAddress, PVA_PROTOCOL_REVISION, PVA_DEFAULT_PRIORITY)); _localMulticastTransport->setMutlicastNIF(loAddr, true); @@ -452,7 +444,7 @@ void ServerContextImpl::run(int32 seconds) } // run... - _beaconEmitter->start(); + _beaconEmitter->start(); //TODO review this if(seconds == 0) diff --git a/src/server/serverContext.h b/src/server/serverContext.h index 3d22720..4e92ecc 100644 --- a/src/server/serverContext.h +++ b/src/server/serverContext.h @@ -110,7 +110,6 @@ public: class epicsShareClass ServerContextImpl : public ServerContext, public Context, - public ResponseHandlerFactory, public std::tr1::enable_shared_from_this { public: @@ -143,7 +142,6 @@ public: TransportRegistry::shared_pointer getTransportRegistry(); std::map >& getSecurityPlugins(); - std::auto_ptr createResponseHandler(); virtual void newServerDetected(); @@ -376,7 +374,12 @@ private: */ TransportRegistry::shared_pointer _transportRegistry; - /** + /** + * Response handler. + */ + ResponseHandler::shared_pointer _responseHandler; + + /** * Channel access. */ ChannelProviderRegistry::shared_pointer _channelProviderRegistry; diff --git a/testApp/remote/testServer.cpp b/testApp/remote/testServer.cpp index 5ff0e84..6400478 100644 --- a/testApp/remote/testServer.cpp +++ b/testApp/remote/testServer.cpp @@ -2881,6 +2881,7 @@ int main(int argc, char *argv[]) .push_map() .build())); TestServer::ctx = srv; + srv->context->printInfo(); srv->start(true); cout << "Done" << endl;