diff --git a/quic/api/QuicTransportBase.cpp b/quic/api/QuicTransportBase.cpp index e0dd56b65..9638847a8 100644 --- a/quic/api/QuicTransportBase.cpp +++ b/quic/api/QuicTransportBase.cpp @@ -141,7 +141,7 @@ const folly::SocketAddress& QuicTransportBase::getLocalAddress() const { } QuicTransportBase::~QuicTransportBase() { - connCallback_ = nullptr; + resetConnectionCallbacks(); closeImpl( std::make_pair( @@ -179,7 +179,7 @@ void QuicTransportBase::close( FOLLY_MAYBE_UNUSED auto self = sharedGuard(); // The caller probably doesn't need a conn callback any more because they // explicitly called close. - connCallback_ = nullptr; + resetConnectionCallbacks(); // If we were called with no error code, ensure that we are going to write // an application close, so the peer knows it didn't come from the transport. @@ -220,7 +220,7 @@ void QuicTransportBase::closeGracefully() { return; } FOLLY_MAYBE_UNUSED auto self = sharedGuard(); - connCallback_ = nullptr; + resetConnectionCallbacks(); closeState_ = CloseState::GRACEFUL_CLOSING; updatePacingOnClose(*conn_); if (conn_->qLogger) { @@ -420,7 +420,7 @@ void QuicTransportBase::closeImpl( } // can't invoke connection callbacks any more. - connCallback_ = nullptr; + resetConnectionCallbacks(); // Don't need outstanding packets. conn_->outstandings.packets.clear(); diff --git a/quic/api/QuicTransportBase.h b/quic/api/QuicTransportBase.h index 9186636ed..5e93c3eab 100644 --- a/quic/api/QuicTransportBase.h +++ b/quic/api/QuicTransportBase.h @@ -809,6 +809,10 @@ class QuicTransportBase : public QuicSocket { } } + void resetConnectionCallbacks() { + connCallback_ = nullptr; + } + std::atomic evb_; std::unique_ptr socket_; ConnectionCallback* connCallback_{nullptr}; diff --git a/quic/api/test/QuicTransportBaseTest.cpp b/quic/api/test/QuicTransportBaseTest.cpp index 164482afc..fd121773c 100644 --- a/quic/api/test/QuicTransportBaseTest.cpp +++ b/quic/api/test/QuicTransportBaseTest.cpp @@ -210,7 +210,7 @@ class TestQuicTransport } ~TestQuicTransport() override { - connCallback_ = nullptr; + resetConnectionCallbacks(); // we need to call close in the derived class. closeImpl( std::make_pair( diff --git a/quic/api/test/TestQuicTransport.h b/quic/api/test/TestQuicTransport.h index e39da4c06..0ba5d378f 100644 --- a/quic/api/test/TestQuicTransport.h +++ b/quic/api/test/TestQuicTransport.h @@ -36,7 +36,7 @@ class TestQuicTransport ~TestQuicTransport() override { // we need to call close in the derived class. - connCallback_ = nullptr; + resetConnectionCallbacks(); closeImpl( std::make_pair( QuicErrorCode(LocalErrorCode::SHUTTING_DOWN), diff --git a/quic/client/QuicClientTransport.cpp b/quic/client/QuicClientTransport.cpp index bcf170560..ac0ce3387 100644 --- a/quic/client/QuicClientTransport.cpp +++ b/quic/client/QuicClientTransport.cpp @@ -91,7 +91,7 @@ QuicClientTransport::~QuicClientTransport() { VLOG(10) << "Destroyed connection to server=" << conn_->peerAddress; // The caller probably doesn't need the conn callback after destroying the // transport. - connCallback_ = nullptr; + resetConnectionCallbacks(); // Close without draining. closeImpl( std::make_pair( diff --git a/quic/server/QuicServerTransport.cpp b/quic/server/QuicServerTransport.cpp index 68bab6a90..04b0d7e19 100644 --- a/quic/server/QuicServerTransport.cpp +++ b/quic/server/QuicServerTransport.cpp @@ -62,7 +62,7 @@ QuicServerTransport::~QuicServerTransport() { VLOG(10) << "Destroyed connection to client=" << *this; // The caller probably doesn't need the conn callback after destroying the // transport. - connCallback_ = nullptr; + resetConnectionCallbacks(); closeImpl( std::make_pair( QuicErrorCode(LocalErrorCode::SHUTTING_DOWN),