aboutsummaryrefslogtreecommitdiff
path: root/talk/app/webrtc/mediastreamsignaling.cc
diff options
context:
space:
mode:
authorjiayl@webrtc.org <jiayl@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d>2014-06-17 16:02:46 +0000
committerjiayl@webrtc.org <jiayl@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d>2014-06-17 16:02:46 +0000
commit2eaac188bbda9fb2b838a71833024d1975360fa1 (patch)
tree1da694f388635add8bdd638422d299cb31be062c /talk/app/webrtc/mediastreamsignaling.cc
parenta685c9df62fa8e62d47d1e2c99856b2fd3dc0cfa (diff)
downloadwebrtc-2eaac188bbda9fb2b838a71833024d1975360fa1.tar.gz
Makes the sid of a closed DataChannel available to reuse per the spec.
BUG=2646 R=pthatcher@webrtc.org Review URL: https://webrtc-codereview.appspot.com/16579004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@6468 4adac7df-926f-26a2-2b94-8c16560cd09d
Diffstat (limited to 'talk/app/webrtc/mediastreamsignaling.cc')
-rw-r--r--talk/app/webrtc/mediastreamsignaling.cc32
1 files changed, 28 insertions, 4 deletions
diff --git a/talk/app/webrtc/mediastreamsignaling.cc b/talk/app/webrtc/mediastreamsignaling.cc
index c7fa67323a..99f627a1d3 100644
--- a/talk/app/webrtc/mediastreamsignaling.cc
+++ b/talk/app/webrtc/mediastreamsignaling.cc
@@ -274,6 +274,23 @@ bool MediaStreamSignaling::AddDataChannelFromOpenMessage(
return true;
}
+void MediaStreamSignaling::RemoveSctpDataChannel(int sid) {
+ for (SctpDataChannels::iterator iter = sctp_data_channels_.begin();
+ iter != sctp_data_channels_.end();
+ ++iter) {
+ if ((*iter)->id() == sid) {
+ sctp_data_channels_.erase(iter);
+
+ if (talk_base::IsEven(sid) && sid <= last_allocated_sctp_even_sid_) {
+ last_allocated_sctp_even_sid_ = sid - 2;
+ } else if (talk_base::IsOdd(sid) && sid <= last_allocated_sctp_odd_sid_) {
+ last_allocated_sctp_odd_sid_ = sid - 2;
+ }
+ return;
+ }
+ }
+}
+
bool MediaStreamSignaling::AddLocalStream(MediaStreamInterface* local_stream) {
if (local_streams_->find(local_stream->label()) != NULL) {
LOG(LS_WARNING) << "MediaStream with label " << local_stream->label()
@@ -481,12 +498,19 @@ void MediaStreamSignaling::OnVideoChannelClose() {
}
void MediaStreamSignaling::OnDataChannelClose() {
- RtpDataChannels::iterator it1 = rtp_data_channels_.begin();
- for (; it1 != rtp_data_channels_.end(); ++it1) {
+ // Use a temporary copy of the RTP/SCTP DataChannel list because the
+ // DataChannel may callback to us and try to modify the list.
+ RtpDataChannels temp_rtp_dcs;
+ temp_rtp_dcs.swap(rtp_data_channels_);
+ RtpDataChannels::iterator it1 = temp_rtp_dcs.begin();
+ for (; it1 != temp_rtp_dcs.end(); ++it1) {
it1->second->OnDataEngineClose();
}
- SctpDataChannels::iterator it2 = sctp_data_channels_.begin();
- for (; it2 != sctp_data_channels_.end(); ++it2) {
+
+ SctpDataChannels temp_sctp_dcs;
+ temp_sctp_dcs.swap(sctp_data_channels_);
+ SctpDataChannels::iterator it2 = temp_sctp_dcs.begin();
+ for (; it2 != temp_sctp_dcs.end(); ++it2) {
(*it2)->OnDataEngineClose();
}
}