From a9571fa4649ec818f585efe9e522f42ab349e36d Mon Sep 17 00:00:00 2001 From: Sergey Mitrofanov Date: Fri, 21 Jun 2024 15:54:12 +0300 Subject: [PATCH] Use weak_ptr when creating a callback for resolver in ntcr/ntcp::StreamSocket --- groups/ntc/ntcp/ntcp_streamsocket.cpp | 30 +++++++++++++++----- groups/ntc/ntcp/ntcp_streamsocket.h | 3 +- groups/ntc/ntcr/ntcr_streamsocket.cpp | 41 ++++++++++++++++++--------- groups/ntc/ntcr/ntcr_streamsocket.h | 3 +- 4 files changed, 53 insertions(+), 24 deletions(-) diff --git a/groups/ntc/ntcp/ntcp_streamsocket.cpp b/groups/ntc/ntcp/ntcp_streamsocket.cpp index f4411273..db12f791 100644 --- a/groups/ntc/ntcp/ntcp_streamsocket.cpp +++ b/groups/ntc/ntcp/ntcp_streamsocket.cpp @@ -3265,8 +3265,8 @@ ntsa::Error StreamSocket::privateUpgrade( bdlf::MemFnUtil::memFn(&StreamSocket::privateEncryptionHandshake, this); - error = d_encryption_sp->initiateHandshake(upgradeOptions, - handshakeCallback); + error = + d_encryption_sp->initiateHandshake(upgradeOptions, handshakeCallback); if (error) { return error; } @@ -3392,7 +3392,7 @@ void StreamSocket::privateRetryConnect( error = this->privateRetryConnectToEndpoint(self); } else { - error = this->privateRetryConnectToName(self); + error = this->privateRetryConnectToName(); } if (error) { @@ -3400,9 +3400,25 @@ void StreamSocket::privateRetryConnect( } } -ntsa::Error StreamSocket::privateRetryConnectToName( - const bsl::shared_ptr& self) +ntsa::Error StreamSocket::privateRetryConnectToName() { + struct WeakBinder { + static void invoke(const bsl::weak_ptr& socket, + const bsl::shared_ptr& resolver, + const ntsa::Endpoint& endpoint, + const ntca::GetEndpointEvent& getEndpointEvent, + bsl::size_t connectAttempts) + { + const bsl::shared_ptr strongRef = socket.lock(); + if (strongRef) { + strongRef->processRemoteEndpointResolution(resolver, + endpoint, + getEndpointEvent, + connectAttempts); + } + } + }; + ntsa::Error error; ntcs::ObserverRef resolverRef(&d_resolver); @@ -3415,8 +3431,8 @@ ntsa::Error StreamSocket::privateRetryConnectToName( ntci::GetEndpointCallback getEndpointCallback = resolverRef->createGetEndpointCallback( - NTCCFG_BIND(&StreamSocket::processRemoteEndpointResolution, - self, + NTCCFG_BIND(&WeakBinder::invoke, + this->weak_from_this(), NTCCFG_BIND_PLACEHOLDER_1, NTCCFG_BIND_PLACEHOLDER_2, NTCCFG_BIND_PLACEHOLDER_3, diff --git a/groups/ntc/ntcp/ntcp_streamsocket.h b/groups/ntc/ntcp/ntcp_streamsocket.h index ee97afe0..9b4756b3 100644 --- a/groups/ntc/ntcp/ntcp_streamsocket.h +++ b/groups/ntc/ntcp/ntcp_streamsocket.h @@ -490,8 +490,7 @@ class StreamSocket : public ntci::StreamSocket, void privateRetryConnect(const bsl::shared_ptr& self); /// Retry connecting to the remote name. Return the error. - ntsa::Error privateRetryConnectToName( - const bsl::shared_ptr& self); + ntsa::Error privateRetryConnectToName(); /// Retry connecting to the remote endpoint. Return the error. ntsa::Error privateRetryConnectToEndpoint( diff --git a/groups/ntc/ntcr/ntcr_streamsocket.cpp b/groups/ntc/ntcr/ntcr_streamsocket.cpp index c9278369..c49bc3b0 100644 --- a/groups/ntc/ntcr/ntcr_streamsocket.cpp +++ b/groups/ntc/ntcr/ntcr_streamsocket.cpp @@ -3992,8 +3992,8 @@ ntsa::Error StreamSocket::privateUpgrade( bdlf::MemFnUtil::memFn(&StreamSocket::privateEncryptionHandshake, this); - error = d_encryption_sp->initiateHandshake( - upgradeOptions, handshakeCallback); + error = + d_encryption_sp->initiateHandshake(upgradeOptions, handshakeCallback); if (error) { return error; } @@ -4126,7 +4126,7 @@ void StreamSocket::privateRetryConnect( error = this->privateRetryConnectToEndpoint(self); } else { - error = this->privateRetryConnectToName(self); + error = this->privateRetryConnectToName(); } if (error) { @@ -4134,9 +4134,24 @@ void StreamSocket::privateRetryConnect( } } -ntsa::Error StreamSocket::privateRetryConnectToName( - const bsl::shared_ptr& self) +ntsa::Error StreamSocket::privateRetryConnectToName() { + struct WeakBinder { + static void invoke(const bsl::weak_ptr& socket, + const bsl::shared_ptr& resolver, + const ntsa::Endpoint& endpoint, + const ntca::GetEndpointEvent& getEndpointEvent, + bsl::size_t connectAttempts) + { + const bsl::shared_ptr strongRef = socket.lock(); + if (strongRef) { + strongRef->processRemoteEndpointResolution(resolver, + endpoint, + getEndpointEvent, + connectAttempts); + } + } + }; ntsa::Error error; ntcs::ObserverRef resolverRef(&d_resolver); @@ -4149,8 +4164,8 @@ ntsa::Error StreamSocket::privateRetryConnectToName( ntci::GetEndpointCallback getEndpointCallback = resolverRef->createGetEndpointCallback( - NTCCFG_BIND(&StreamSocket::processRemoteEndpointResolution, - self, + NTCCFG_BIND(&WeakBinder::invoke, + this->weak_from_this(), NTCCFG_BIND_PLACEHOLDER_1, NTCCFG_BIND_PLACEHOLDER_2, NTCCFG_BIND_PLACEHOLDER_3, @@ -4277,9 +4292,9 @@ ntsa::Error StreamSocket::privateTimestampOutgoingData( { ntsa::SocketOption option(d_allocator_p); - error = d_socket_sp->getOption( - &option, - ntsa::SocketOptionType::e_TX_TIMESTAMPING); + error = + d_socket_sp->getOption(&option, + ntsa::SocketOptionType::e_TX_TIMESTAMPING); if (error) { if (error != ntsa::Error::e_NOT_IMPLEMENTED) { NTCI_LOG_TRACE("Failed to get socket option: " @@ -4357,9 +4372,9 @@ ntsa::Error StreamSocket::privateTimestampIncomingData( { ntsa::SocketOption option(d_allocator_p); - error = d_socket_sp->getOption( - &option, - ntsa::SocketOptionType::e_RX_TIMESTAMPING); + error = + d_socket_sp->getOption(&option, + ntsa::SocketOptionType::e_RX_TIMESTAMPING); if (error) { if (error != ntsa::Error::e_NOT_IMPLEMENTED) { NTCI_LOG_TRACE("Failed to get socket option: " diff --git a/groups/ntc/ntcr/ntcr_streamsocket.h b/groups/ntc/ntcr/ntcr_streamsocket.h index a9aa2d60..250fe61d 100644 --- a/groups/ntc/ntcr/ntcr_streamsocket.h +++ b/groups/ntc/ntcr/ntcr_streamsocket.h @@ -522,8 +522,7 @@ class StreamSocket : public ntci::StreamSocket, void privateRetryConnect(const bsl::shared_ptr& self); /// Retry connecting to the remote name. Return the error. - ntsa::Error privateRetryConnectToName( - const bsl::shared_ptr& self); + ntsa::Error privateRetryConnectToName(); /// Retry connecting to the remote endpoint. Return the error. ntsa::Error privateRetryConnectToEndpoint(