Set/clear the data channel pointers on the network thread
Bug: webrtc:9987
Change-Id: I8fa1b675a54729a26ee55926c6f27bb59981d379
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/213665
Commit-Queue: Tommi <tommi@webrtc.org>
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#33640}
diff --git a/pc/peer_connection.cc b/pc/peer_connection.cc
index 84803da..aaf7232 100644
--- a/pc/peer_connection.cc
+++ b/pc/peer_connection.cc
@@ -522,11 +522,13 @@
// should be destroyed there.
network_thread()->Invoke<void>(RTC_FROM_HERE, [this] {
RTC_DCHECK_RUN_ON(network_thread());
+ TeardownDataChannelTransport_n();
transport_controller_.reset();
port_allocator_.reset();
if (network_thread_safety_)
network_thread_safety_->SetNotAlive();
});
+
// call_ and event_log_ must be destroyed on the worker thread.
worker_thread()->Invoke<void>(RTC_FROM_HERE, [this] {
RTC_DCHECK_RUN_ON(worker_thread());
@@ -1737,6 +1739,12 @@
rtp_manager_->Close();
network_thread()->Invoke<void>(RTC_FROM_HERE, [this] {
+ // Data channels will already have been unset via the DestroyAllChannels()
+ // call above, which triggers a call to TeardownDataChannelTransport_n().
+ // TODO(tommi): ^^ That's not exactly optimal since this is yet another
+ // blocking hop to the network thread during Close(). Further still, the
+ // voice/video/data channels will be cleared on the worker thread.
+ RTC_DCHECK(!data_channel_controller_.rtp_data_channel());
transport_controller_.reset();
port_allocator_->DiscardCandidatePool();
if (network_thread_safety_) {
@@ -2410,16 +2418,30 @@
return true;
}
-void PeerConnection::TeardownDataChannelTransport_n() {
- if (!sctp_mid_n_ && !data_channel_controller_.data_channel_transport()) {
+void PeerConnection::SetupRtpDataChannelTransport_n(
+ cricket::RtpDataChannel* data_channel) {
+ data_channel_controller_.set_rtp_data_channel(data_channel);
+ if (!data_channel)
return;
- }
- RTC_LOG(LS_INFO) << "Tearing down data channel transport for mid="
- << *sctp_mid_n_;
- // |sctp_mid_| may still be active through an SCTP transport. If not, unset
- // it.
- sctp_mid_n_.reset();
+ // TODO(bugs.webrtc.org/9987): OnSentPacket_w needs to be changed to
+ // OnSentPacket_n (and be called on the network thread).
+ data_channel->SignalSentPacket().connect(this,
+ &PeerConnection::OnSentPacket_w);
+}
+
+void PeerConnection::TeardownDataChannelTransport_n() {
+ // Clear the RTP data channel if any.
+ data_channel_controller_.set_rtp_data_channel(nullptr);
+
+ if (sctp_mid_n_) {
+ // |sctp_mid_| may still be active through an SCTP transport. If not, unset
+ // it.
+ RTC_LOG(LS_INFO) << "Tearing down data channel transport for mid="
+ << *sctp_mid_n_;
+ sctp_mid_n_.reset();
+ }
+
data_channel_controller_.TeardownDataChannelTransport_n();
}