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

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: 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 | no next file » | 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_FREE_DATACHANNEL,
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 1187 matching lines...) Expand 10 before | Expand all | Expand 10 after
1306 break; 1307 break;
1307 } 1308 }
1308 case MSG_GETSTATS: { 1309 case MSG_GETSTATS: {
1309 GetStatsMsg* param = static_cast<GetStatsMsg*>(msg->pdata); 1310 GetStatsMsg* param = static_cast<GetStatsMsg*>(msg->pdata);
1310 StatsReports reports; 1311 StatsReports reports;
1311 stats_->GetStats(param->track, &reports); 1312 stats_->GetStats(param->track, &reports);
1312 param->observer->OnComplete(reports); 1313 param->observer->OnComplete(reports);
1313 delete param; 1314 delete param;
1314 break; 1315 break;
1315 } 1316 }
1317 case MSG_FREE_DATACHANNEL: {
1318 auto param =
1319 static_cast<rtc::TypedMessageData<rtc::scoped_refptr<DataChannel>>*>(
1320 msg->pdata);
1321 delete param;
pthatcher1 2015/12/03 19:45:15 Does "delete msg->pdata" not work without the cast
1322 break;
1323 }
1316 default: 1324 default:
1317 RTC_DCHECK(false && "Not implemented"); 1325 RTC_DCHECK(false && "Not implemented");
1318 break; 1326 break;
1319 } 1327 }
1320 } 1328 }
1321 1329
1322 void PeerConnection::CreateAudioReceiver(MediaStreamInterface* stream, 1330 void PeerConnection::CreateAudioReceiver(MediaStreamInterface* stream,
1323 AudioTrackInterface* audio_track, 1331 AudioTrackInterface* audio_track,
1324 uint32_t ssrc) { 1332 uint32_t ssrc) {
1325 receivers_.push_back(new AudioRtpReceiver(audio_track, ssrc, session_.get())); 1333 receivers_.push_back(new AudioRtpReceiver(audio_track, ssrc, session_.get()));
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after
1893 } 1901 }
1894 } 1902 }
1895 1903
1896 void PeerConnection::OnSctpDataChannelClosed(DataChannel* channel) { 1904 void PeerConnection::OnSctpDataChannelClosed(DataChannel* channel) {
1897 for (auto it = sctp_data_channels_.begin(); it != sctp_data_channels_.end(); 1905 for (auto it = sctp_data_channels_.begin(); it != sctp_data_channels_.end();
1898 ++it) { 1906 ++it) {
1899 if (it->get() == channel) { 1907 if (it->get() == channel) {
1900 if (channel->id() >= 0) { 1908 if (channel->id() >= 0) {
1901 sid_allocator_.ReleaseSid(channel->id()); 1909 sid_allocator_.ReleaseSid(channel->id());
1902 } 1910 }
1911 // Since this method is triggered by a signal from the DataChannel,
1912 // we can't free it directly here; we need to free it asynchronously.
1913 signaling_thread()->Post(
1914 this, MSG_FREE_DATACHANNEL,
pthatcher1 2015/12/03 19:45:15 If you don't need the type cast, you could just ca
Taylor Brandstetter 2015/12/04 19:27:45 Good point. Done.
1915 new rtc::TypedMessageData<rtc::scoped_refptr<DataChannel>>(channel));
1903 sctp_data_channels_.erase(it); 1916 sctp_data_channels_.erase(it);
1904 return; 1917 return;
1905 } 1918 }
1906 } 1919 }
1907 } 1920 }
1908 1921
1909 void PeerConnection::OnVoiceChannelDestroyed() { 1922 void PeerConnection::OnVoiceChannelDestroyed() {
1910 EndRemoteTracks(cricket::MEDIA_TYPE_AUDIO); 1923 EndRemoteTracks(cricket::MEDIA_TYPE_AUDIO);
1911 } 1924 }
1912 1925
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
2009 DataChannel* PeerConnection::FindDataChannelBySid(int sid) const { 2022 DataChannel* PeerConnection::FindDataChannelBySid(int sid) const {
2010 for (const auto& channel : sctp_data_channels_) { 2023 for (const auto& channel : sctp_data_channels_) {
2011 if (channel->id() == sid) { 2024 if (channel->id() == sid) {
2012 return channel; 2025 return channel;
2013 } 2026 }
2014 } 2027 }
2015 return nullptr; 2028 return nullptr;
2016 } 2029 }
2017 2030
2018 } // namespace webrtc 2031 } // namespace webrtc
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698