From a10534d74d6d3caf85c180eedfdbb51698da0277 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Tue, 28 Nov 2017 15:28:59 -0600 Subject: [PATCH] eliminate Connector interface no code generically creates UDP or TCP connections, so this abstraction results only in unnecessary virtual calls and casts. --- src/remote/blockingTCPConnector.cpp | 3 --- src/remote/blockingUDPConnector.cpp | 19 +++++++++---------- src/remote/blockingUDPTransport.cpp | 18 +++++++++--------- src/remote/pv/blockingTCP.h | 6 ++---- src/remote/pv/blockingUDP.h | 21 ++------------------- src/remote/pv/remote.h | 22 ---------------------- 6 files changed, 22 insertions(+), 67 deletions(-) diff --git a/src/remote/blockingTCPConnector.cpp b/src/remote/blockingTCPConnector.cpp index cb82484..d7c2530 100644 --- a/src/remote/blockingTCPConnector.cpp +++ b/src/remote/blockingTCPConnector.cpp @@ -33,9 +33,6 @@ BlockingTCPConnector::BlockingTCPConnector( { } -BlockingTCPConnector::~BlockingTCPConnector() { -} - SOCKET BlockingTCPConnector::tryConnect(osiSockAddr& address, int tries) { char strBuffer[64]; diff --git a/src/remote/blockingUDPConnector.cpp b/src/remote/blockingUDPConnector.cpp index 5e916d2..3b83faa 100644 --- a/src/remote/blockingUDPConnector.cpp +++ b/src/remote/blockingUDPConnector.cpp @@ -18,9 +18,9 @@ using namespace epics::pvData; namespace { struct closer { - epics::pvAccess::Transport::shared_pointer P; - closer(const epics::pvAccess::Transport::shared_pointer& P) :P(P) {} - void operator()(epics::pvAccess::Transport*) { + epics::pvAccess::BlockingUDPTransport::shared_pointer P; + closer(const epics::pvAccess::BlockingUDPTransport::shared_pointer& P) :P(P) {} + void operator()(epics::pvAccess::BlockingUDPTransport*) { try{ P->close(); }catch(...){ @@ -35,7 +35,7 @@ struct closer { namespace epics { namespace pvAccess { -Transport::shared_pointer BlockingUDPConnector::connect(std::tr1::shared_ptr const & /*client*/, +BlockingUDPTransport::shared_pointer BlockingUDPConnector::connect(std::tr1::shared_ptr const & /*client*/, ResponseHandler::shared_pointer const & responseHandler, osiSockAddr& bindAddress, int8 transportRevision, int16 /*priority*/) { @@ -47,7 +47,7 @@ Transport::shared_pointer BlockingUDPConnector::connect(std::tr1::shared_ptrinternal_this = transport; // the worker thread holds a strong ref, which is released by transport->close() - // note: casting to Transport* to prevent iOS version of shared_ptr from trying (and failing) - // to setup shared_from_this() using the wrapped pointer - Transport::shared_pointer ret(static_cast(transport.get()), closer(transport)); + BlockingUDPTransport::shared_pointer ret(transport.get(), closer(transport)); return ret; } diff --git a/src/remote/blockingUDPTransport.cpp b/src/remote/blockingUDPTransport.cpp index 2437d54..bcf49d0 100644 --- a/src/remote/blockingUDPTransport.cpp +++ b/src/remote/blockingUDPTransport.cpp @@ -207,7 +207,7 @@ void BlockingUDPTransport::run() { osiSockAddr fromAddress; osiSocklen_t addrStructSize = sizeof(sockaddr); - Transport::shared_pointer thisTransport = shared_from_this(); + Transport::shared_pointer thisTransport(internal_this); try { @@ -573,10 +573,10 @@ void initializeUDPTransports(bool serverFlag, anyAddress.ia.sin_port = htons(0); anyAddress.ia.sin_addr.s_addr = htonl(INADDR_ANY); - sendTransport = static_pointer_cast(connector->connect( + sendTransport = connector->connect( nullTransportClient, responseHandler, anyAddress, PVA_PROTOCOL_REVISION, - PVA_DEFAULT_PRIORITY)); + PVA_DEFAULT_PRIORITY); if (!sendTransport) { THROW_BASE_EXCEPTION("Failed to initialize UDP transport."); @@ -693,10 +693,10 @@ void initializeUDPTransports(bool serverFlag, listenLocalAddress.ia.sin_port = htons(listenPort); listenLocalAddress.ia.sin_addr.s_addr = node.ifaceAddr.ia.sin_addr.s_addr; - BlockingUDPTransport::shared_pointer transport = static_pointer_cast(connector->connect( + BlockingUDPTransport::shared_pointer transport = connector->connect( nullTransportClient, responseHandler, listenLocalAddress, PVA_PROTOCOL_REVISION, - PVA_DEFAULT_PRIORITY)); + PVA_DEFAULT_PRIORITY); if (!transport) continue; listenLocalAddress = *transport->getRemoteAddress(); @@ -730,10 +730,10 @@ void initializeUDPTransports(bool serverFlag, bcastAddress.ia.sin_port = htons(listenPort); bcastAddress.ia.sin_addr.s_addr = node.ifaceBCast.ia.sin_addr.s_addr; - transport2 = static_pointer_cast(connector->connect( + transport2 = connector->connect( nullTransportClient, responseHandler, bcastAddress, PVA_PROTOCOL_REVISION, - PVA_DEFAULT_PRIORITY)); + PVA_DEFAULT_PRIORITY); if (transport2) { /* The other wrinkle is that nothing should be sent from this second @@ -786,7 +786,7 @@ void initializeUDPTransports(bool serverFlag, try { // NOTE: multicast receiver socket must be "bound" to INADDR_ANY or multicast address - localMulticastTransport = static_pointer_cast(connector->connect( + localMulticastTransport = connector->connect( nullTransportClient, responseHandler, #if !defined(_WIN32) group, @@ -794,7 +794,7 @@ void initializeUDPTransports(bool serverFlag, anyAddress, #endif PVA_PROTOCOL_REVISION, - PVA_DEFAULT_PRIORITY)); + PVA_DEFAULT_PRIORITY); if (!localMulticastTransport) throw std::runtime_error("Failed to bind UDP socket."); diff --git a/src/remote/pv/blockingTCP.h b/src/remote/pv/blockingTCP.h index 084e702..ceb361a 100644 --- a/src/remote/pv/blockingTCP.h +++ b/src/remote/pv/blockingTCP.h @@ -49,16 +49,14 @@ class ClientChannelImpl; * @author Matej Sekoranja * @version $Id: BlockingTCPConnector.java,v 1.1 2010/05/03 14:45:47 mrkraimer Exp $ */ -class BlockingTCPConnector : public Connector { +class BlockingTCPConnector { public: POINTER_DEFINITIONS(BlockingTCPConnector); BlockingTCPConnector(Context::shared_pointer const & context, int receiveBufferSize, float beaconInterval); - virtual ~BlockingTCPConnector(); - - virtual Transport::shared_pointer connect(std::tr1::shared_ptr const & client, + Transport::shared_pointer connect(std::tr1::shared_ptr const & client, ResponseHandler::shared_pointer const & responseHandler, osiSockAddr& address, epics::pvData::int8 transportRevision, epics::pvData::int16 priority); private: diff --git a/src/remote/pv/blockingUDP.h b/src/remote/pv/blockingUDP.h index fe836f6..2d0afc8 100644 --- a/src/remote/pv/blockingUDP.h +++ b/src/remote/pv/blockingUDP.h @@ -44,13 +44,13 @@ enum InetAddressType { inetAddressType_all, inetAddressType_unicast, inetAddress class BlockingUDPTransport : public epics::pvData::NoDefaultMethods, public Transport, public TransportSendControl, - public std::tr1::enable_shared_from_this, public epicsThreadRunable { public: POINTER_DEFINITIONS(BlockingUDPTransport); private: + std::tr1::weak_ptr internal_this; friend class BlockingUDPConnector; BlockingUDPTransport(bool serverFlag, ResponseHandler::shared_pointer const & responseHandler, @@ -58,19 +58,6 @@ private: short remoteTransportRevision); public: - static shared_pointer create(bool serverFlag, - ResponseHandler::shared_pointer const & responseHandler, - SOCKET channel, osiSockAddr& bindAddress, - short remoteTransportRevision) EPICS_DEPRECATED - { - shared_pointer thisPointer( - new BlockingUDPTransport(serverFlag, responseHandler, - channel, bindAddress, - remoteTransportRevision) - ); - return thisPointer; - } - virtual ~BlockingUDPTransport(); virtual bool isClosed() { @@ -428,7 +415,6 @@ private: }; class BlockingUDPConnector : - public Connector, private epics::pvData::NoDefaultMethods { public: POINTER_DEFINITIONS(BlockingUDPConnector); @@ -442,13 +428,10 @@ public: _broadcast(broadcast) { } - virtual ~BlockingUDPConnector() { - } - /** * NOTE: transport client is ignored for broadcast (UDP). */ - virtual Transport::shared_pointer connect(std::tr1::shared_ptr const & client, + BlockingUDPTransport::shared_pointer connect(std::tr1::shared_ptr const & client, ResponseHandler::shared_pointer const & responseHandler, osiSockAddr& bindAddress, epics::pvData::int8 transportRevision, epics::pvData::int16 priority); diff --git a/src/remote/pv/remote.h b/src/remote/pv/remote.h index 8d987c7..26f78a4 100644 --- a/src/remote/pv/remote.h +++ b/src/remote/pv/remote.h @@ -377,28 +377,6 @@ protected: epics::pvData::int32 _debugLevel; }; -/** - * Interface defining socket connector (Connector-Transport pattern). - */ -class Connector { -public: - virtual ~Connector() {} - - /** - * Connect. - * @param[in] client client requesting connection (transport). - * @param[in] address address of the server. - * @param[in] responseHandler reponse handler. - * @param[in] transportRevision transport revision to be used. - * @param[in] priority process priority. - * @return transport instance. - */ - virtual Transport::shared_pointer connect(std::tr1::shared_ptr const & client, - ResponseHandler::shared_pointer const & responseHandler, osiSockAddr& address, - epics::pvData::int8 transportRevision, epics::pvData::int16 priority) = 0; - -}; - /** * A request that expects an response. * Responses identified by its I/O ID.