Index: webrtc/pc/channel.cc |
diff --git a/webrtc/pc/channel.cc b/webrtc/pc/channel.cc |
index 7e4d5d2dac1e9596566fc591ef992519616f8594..67c16ec64aa1a47cb177e4ef6f3b4c7e5d8abec4 100644 |
--- a/webrtc/pc/channel.cc |
+++ b/webrtc/pc/channel.cc |
@@ -183,8 +183,6 @@ BaseChannel::~BaseChannel() { |
ASSERT(worker_thread_ == rtc::Thread::Current()); |
Deinit(); |
StopConnectionMonitor(); |
- // Send any outstanding RTCP packets. |
- network_thread_->Invoke<void>(Bind(&BaseChannel::FlushRtcpMessages_n, this)); |
// Eats any outstanding messages or packets. |
worker_thread_->Clear(&invoker_); |
worker_thread_->Clear(this); |
@@ -194,21 +192,40 @@ BaseChannel::~BaseChannel() { |
delete media_channel_; |
// Note that we don't just call SetTransportChannel_n(nullptr) because that |
// would call a pure virtual method which we can't do from a destructor. |
- network_thread_->Invoke<void>(Bind(&BaseChannel::DeinitNetwork_n, this)); |
+ network_thread_->Invoke<void>( |
+ Bind(&BaseChannel::DestroyTransportChannels_n, this)); |
LOG(LS_INFO) << "Destroyed channel"; |
} |
-void BaseChannel::DeinitNetwork_n() { |
+void BaseChannel::DisconnectTransportChannels_n() { |
+ // Send any outstanding RTCP packets. |
+ FlushRtcpMessages_n(); |
+ |
+ // Stop signals from transport channels, but keep them alive because |
+ // media_channel may use them from a different thread. |
if (transport_channel_) { |
DisconnectFromTransportChannel(transport_channel_); |
+ } |
+ if (rtcp_transport_channel_) { |
+ DisconnectFromTransportChannel(rtcp_transport_channel_); |
+ } |
+ |
+ // Clear pending read packets/messages. |
+ network_thread_->Clear(&invoker_); |
+ network_thread_->Clear(this); |
+} |
+ |
+void BaseChannel::DestroyTransportChannels_n() { |
+ if (transport_channel_) { |
transport_controller_->DestroyTransportChannel_n( |
transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTP); |
} |
if (rtcp_transport_channel_) { |
- DisconnectFromTransportChannel(rtcp_transport_channel_); |
transport_controller_->DestroyTransportChannel_n( |
transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTCP); |
} |
+ // Clear pending send packets/messages. |
+ network_thread_->Clear(&invoker_); |
network_thread_->Clear(this); |
} |
@@ -243,6 +260,11 @@ bool BaseChannel::InitNetwork_n() { |
void BaseChannel::Deinit() { |
RTC_DCHECK(worker_thread_->IsCurrent()); |
media_channel_->SetInterface(NULL); |
+ // Packets arrive on the network thread, processing packets calls virtual |
+ // functions, so need to stop this process in Deinit that is called in |
+ // derived classes destructor. |
+ network_thread_->Invoke<void>( |
+ Bind(&BaseChannel::DisconnectTransportChannels_n, this)); |
} |
bool BaseChannel::SetTransport(const std::string& transport_name) { |