Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(214)

Side by Side Diff: talk/app/webrtc/peerconnection.cc

Issue 1492383002: Free SCTP data channels asynchronously in PeerConnection. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Adding unit test. Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | talk/app/webrtc/peerconnectionendtoend_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * libjingle 2 * libjingle
3 * Copyright 2012 Google Inc. 3 * Copyright 2012 Google Inc.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met: 6 * modification, are permitted provided that the following conditions are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright notice, 8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer. 9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice, 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 }; 99 };
100 static_assert(INVALID == arraysize(kValidIceServiceTypes), 100 static_assert(INVALID == arraysize(kValidIceServiceTypes),
101 "kValidIceServiceTypes must have as many strings as ServiceType " 101 "kValidIceServiceTypes must have as many strings as ServiceType "
102 "has values."); 102 "has values.");
103 103
104 enum { 104 enum {
105 MSG_SET_SESSIONDESCRIPTION_SUCCESS = 0, 105 MSG_SET_SESSIONDESCRIPTION_SUCCESS = 0,
106 MSG_SET_SESSIONDESCRIPTION_FAILED, 106 MSG_SET_SESSIONDESCRIPTION_FAILED,
107 MSG_CREATE_SESSIONDESCRIPTION_FAILED, 107 MSG_CREATE_SESSIONDESCRIPTION_FAILED,
108 MSG_GETSTATS, 108 MSG_GETSTATS,
109 MSG_DELETE,
109 }; 110 };
110 111
111 struct SetSessionDescriptionMsg : public rtc::MessageData { 112 struct SetSessionDescriptionMsg : public rtc::MessageData {
112 explicit SetSessionDescriptionMsg( 113 explicit SetSessionDescriptionMsg(
113 webrtc::SetSessionDescriptionObserver* observer) 114 webrtc::SetSessionDescriptionObserver* observer)
114 : observer(observer) { 115 : observer(observer) {
115 } 116 }
116 117
117 rtc::scoped_refptr<webrtc::SetSessionDescriptionObserver> observer; 118 rtc::scoped_refptr<webrtc::SetSessionDescriptionObserver> observer;
118 std::string error; 119 std::string error;
(...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after
588 uma_observer_(NULL), 589 uma_observer_(NULL),
589 signaling_state_(kStable), 590 signaling_state_(kStable),
590 ice_state_(kIceNew), 591 ice_state_(kIceNew),
591 ice_connection_state_(kIceConnectionNew), 592 ice_connection_state_(kIceConnectionNew),
592 ice_gathering_state_(kIceGatheringNew), 593 ice_gathering_state_(kIceGatheringNew),
593 local_streams_(StreamCollection::Create()), 594 local_streams_(StreamCollection::Create()),
594 remote_streams_(StreamCollection::Create()) {} 595 remote_streams_(StreamCollection::Create()) {}
595 596
596 PeerConnection::~PeerConnection() { 597 PeerConnection::~PeerConnection() {
597 RTC_DCHECK(signaling_thread()->IsCurrent()); 598 RTC_DCHECK(signaling_thread()->IsCurrent());
599 // Finish any pending deletions.
600 signaling_thread()->Clear(this, MSG_DELETE, nullptr);
598 // Need to detach RTP senders/receivers from WebRtcSession, 601 // Need to detach RTP senders/receivers from WebRtcSession,
599 // since it's about to be destroyed. 602 // since it's about to be destroyed.
600 for (const auto& sender : senders_) { 603 for (const auto& sender : senders_) {
601 sender->Stop(); 604 sender->Stop();
602 } 605 }
603 for (const auto& receiver : receivers_) { 606 for (const auto& receiver : receivers_) {
604 receiver->Stop(); 607 receiver->Stop();
605 } 608 }
606 } 609 }
607 610
(...skipping 698 matching lines...) Expand 10 before | Expand all | Expand 10 after
1306 break; 1309 break;
1307 } 1310 }
1308 case MSG_GETSTATS: { 1311 case MSG_GETSTATS: {
1309 GetStatsMsg* param = static_cast<GetStatsMsg*>(msg->pdata); 1312 GetStatsMsg* param = static_cast<GetStatsMsg*>(msg->pdata);
1310 StatsReports reports; 1313 StatsReports reports;
1311 stats_->GetStats(param->track, &reports); 1314 stats_->GetStats(param->track, &reports);
1312 param->observer->OnComplete(reports); 1315 param->observer->OnComplete(reports);
1313 delete param; 1316 delete param;
1314 break; 1317 break;
1315 } 1318 }
1319 case MSG_DELETE: {
1320 delete msg->pdata;
1321 break;
1322 }
1316 default: 1323 default:
1317 RTC_DCHECK(false && "Not implemented"); 1324 RTC_DCHECK(false && "Not implemented");
1318 break; 1325 break;
1319 } 1326 }
1320 } 1327 }
1321 1328
1322 void PeerConnection::CreateAudioReceiver(MediaStreamInterface* stream, 1329 void PeerConnection::CreateAudioReceiver(MediaStreamInterface* stream,
1323 AudioTrackInterface* audio_track, 1330 AudioTrackInterface* audio_track,
1324 uint32_t ssrc) { 1331 uint32_t ssrc) {
1325 receivers_.push_back(new AudioRtpReceiver(audio_track, ssrc, session_.get())); 1332 receivers_.push_back(new AudioRtpReceiver(audio_track, ssrc, session_.get()));
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after
1893 } 1900 }
1894 } 1901 }
1895 1902
1896 void PeerConnection::OnSctpDataChannelClosed(DataChannel* channel) { 1903 void PeerConnection::OnSctpDataChannelClosed(DataChannel* channel) {
1897 for (auto it = sctp_data_channels_.begin(); it != sctp_data_channels_.end(); 1904 for (auto it = sctp_data_channels_.begin(); it != sctp_data_channels_.end();
1898 ++it) { 1905 ++it) {
1899 if (it->get() == channel) { 1906 if (it->get() == channel) {
1900 if (channel->id() >= 0) { 1907 if (channel->id() >= 0) {
1901 sid_allocator_.ReleaseSid(channel->id()); 1908 sid_allocator_.ReleaseSid(channel->id());
1902 } 1909 }
1910 // Since this method is triggered by a signal from the DataChannel,
1911 // we can't free it directly here; we need to free it asynchronously.
1912 signaling_thread()->Post(
1913 this, MSG_DELETE,
1914 new rtc::TypedMessageData<rtc::scoped_refptr<DataChannel>>(channel));
1903 sctp_data_channels_.erase(it); 1915 sctp_data_channels_.erase(it);
1904 return; 1916 return;
1905 } 1917 }
1906 } 1918 }
1907 } 1919 }
1908 1920
1909 void PeerConnection::OnVoiceChannelDestroyed() { 1921 void PeerConnection::OnVoiceChannelDestroyed() {
1910 EndRemoteTracks(cricket::MEDIA_TYPE_AUDIO); 1922 EndRemoteTracks(cricket::MEDIA_TYPE_AUDIO);
1911 } 1923 }
1912 1924
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
2009 DataChannel* PeerConnection::FindDataChannelBySid(int sid) const { 2021 DataChannel* PeerConnection::FindDataChannelBySid(int sid) const {
2010 for (const auto& channel : sctp_data_channels_) { 2022 for (const auto& channel : sctp_data_channels_) {
2011 if (channel->id() == sid) { 2023 if (channel->id() == sid) {
2012 return channel; 2024 return channel;
2013 } 2025 }
2014 } 2026 }
2015 return nullptr; 2027 return nullptr;
2016 } 2028 }
2017 2029
2018 } // namespace webrtc 2030 } // namespace webrtc
OLDNEW
« no previous file with comments | « no previous file | talk/app/webrtc/peerconnectionendtoend_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698