| Index: talk/app/webrtc/peerconnection.cc
|
| diff --git a/talk/app/webrtc/peerconnection.cc b/talk/app/webrtc/peerconnection.cc
|
| index f0db1397aa7941612612ea3be8cb010b0b09c854..8d04ae629068f367b5daeecfe6c03398f97692aa 100644
|
| --- a/talk/app/webrtc/peerconnection.cc
|
| +++ b/talk/app/webrtc/peerconnection.cc
|
| @@ -106,6 +106,7 @@ enum {
|
| MSG_SET_SESSIONDESCRIPTION_FAILED,
|
| MSG_CREATE_SESSIONDESCRIPTION_FAILED,
|
| MSG_GETSTATS,
|
| + MSG_DELETE,
|
| };
|
|
|
| struct SetSessionDescriptionMsg : public rtc::MessageData {
|
| @@ -595,6 +596,8 @@ PeerConnection::PeerConnection(PeerConnectionFactory* factory)
|
|
|
| PeerConnection::~PeerConnection() {
|
| RTC_DCHECK(signaling_thread()->IsCurrent());
|
| + // Finish any pending deletions.
|
| + signaling_thread()->Clear(this, MSG_DELETE, nullptr);
|
| // Need to detach RTP senders/receivers from WebRtcSession,
|
| // since it's about to be destroyed.
|
| for (const auto& sender : senders_) {
|
| @@ -1313,6 +1316,10 @@ void PeerConnection::OnMessage(rtc::Message* msg) {
|
| delete param;
|
| break;
|
| }
|
| + case MSG_DELETE: {
|
| + delete msg->pdata;
|
| + break;
|
| + }
|
| default:
|
| RTC_DCHECK(false && "Not implemented");
|
| break;
|
| @@ -1900,6 +1907,11 @@ void PeerConnection::OnSctpDataChannelClosed(DataChannel* channel) {
|
| if (channel->id() >= 0) {
|
| sid_allocator_.ReleaseSid(channel->id());
|
| }
|
| + // Since this method is triggered by a signal from the DataChannel,
|
| + // we can't free it directly here; we need to free it asynchronously.
|
| + signaling_thread()->Post(
|
| + this, MSG_DELETE,
|
| + new rtc::TypedMessageData<rtc::scoped_refptr<DataChannel>>(channel));
|
| sctp_data_channels_.erase(it);
|
| return;
|
| }
|
|
|