diff --git a/pc/data_channel_controller.cc b/pc/data_channel_controller.cc index 39a31e625d..92cdba3119 100644 --- a/pc/data_channel_controller.cc +++ b/pc/data_channel_controller.cc @@ -165,6 +165,11 @@ void DataChannelController::SetupDataChannelTransport_n() { NotifyDataChannelsOfTransportCreated(); } +void DataChannelController::PrepareForShutdown() { + RTC_DCHECK_RUN_ON(signaling_thread()); + signaling_safety_.reset(); +} + void DataChannelController::TeardownDataChannelTransport_n() { RTC_DCHECK_RUN_ON(network_thread()); if (data_channel_transport()) { diff --git a/pc/data_channel_controller.h b/pc/data_channel_controller.h index 0a46069274..f71e7a45a4 100644 --- a/pc/data_channel_controller.h +++ b/pc/data_channel_controller.h @@ -64,6 +64,9 @@ class DataChannelController : public SctpDataChannelControllerInterface, void OnReadyToSend() override; void OnTransportClosed(RTCError error) override; + // Called as part of destroying the owning PeerConnection. + void PrepareForShutdown(); + // Called from PeerConnection::SetupDataChannelTransport_n void SetupDataChannelTransport_n(); // Called from PeerConnection::TeardownDataChannelTransport_n diff --git a/pc/peer_connection.cc b/pc/peer_connection.cc index dc3e901806..f365601287 100644 --- a/pc/peer_connection.cc +++ b/pc/peer_connection.cc @@ -1924,13 +1924,15 @@ void PeerConnection::Close() { event_log_.reset(); }); ReportUsagePattern(); - // The .h file says that observer can be discarded after close() returns. - // Make sure this is true. - observer_ = nullptr; // Signal shutdown to the sdp handler. This invalidates weak pointers for // internal pending callbacks. sdp_handler_->PrepareForShutdown(); + data_channel_controller_.PrepareForShutdown(); + + // The .h file says that observer can be discarded after close() returns. + // Make sure this is true. + observer_ = nullptr; } void PeerConnection::SetIceConnectionState(IceConnectionState new_state) {