Index: webrtc/api/webrtcsession.cc |
diff --git a/webrtc/api/webrtcsession.cc b/webrtc/api/webrtcsession.cc |
index c5582d3630b7ebdc0644f5a6738ff2bc540d6127..38eeebaf3a9f1286efb3f1e416a7b0a738bb26de 100644 |
--- a/webrtc/api/webrtcsession.cc |
+++ b/webrtc/api/webrtcsession.cc |
@@ -1006,50 +1006,42 @@ bool WebRtcSession::GetTransportDescription( |
return true; |
} |
-bool WebRtcSession::GetTransportStats(SessionStats* stats) { |
+std::unique_ptr<SessionStats> WebRtcSession::GetSessionStats() { |
pthatcher1
2016/12/15 23:18:59
Why not just "GetStats()"?
hbos
2016/12/16 10:38:02
Done.
|
ASSERT(signaling_thread()->IsCurrent()); |
- return (GetChannelTransportStats(voice_channel(), stats) && |
- GetChannelTransportStats(video_channel(), stats) && |
- GetChannelTransportStats(data_channel(), stats)); |
-} |
- |
-bool WebRtcSession::GetChannelTransportStats(cricket::BaseChannel* ch, |
- SessionStats* stats) { |
- ASSERT(signaling_thread()->IsCurrent()); |
- if (!ch) { |
- // Not using this channel. |
- return true; |
+ ChannelNamePairs channel_name_pairs; |
+ if (voice_channel()) { |
+ channel_name_pairs.voice = rtc::Optional<ChannelNamePair>(ChannelNamePair( |
+ voice_channel()->content_name(), voice_channel()->transport_name())); |
} |
- |
- const std::string& content_name = ch->content_name(); |
- const std::string& transport_name = ch->transport_name(); |
- stats->proxy_to_transport[content_name] = transport_name; |
- if (stats->transport_stats.find(transport_name) != |
- stats->transport_stats.end()) { |
- // Transport stats already done for this transport. |
- return true; |
+ if (video_channel()) { |
+ channel_name_pairs.video = rtc::Optional<ChannelNamePair>(ChannelNamePair( |
+ video_channel()->content_name(), video_channel()->transport_name())); |
} |
- |
- cricket::TransportStats tstats; |
- if (!transport_controller_->GetStats(transport_name, &tstats)) { |
- return false; |
+ if (data_channel()) { |
+ channel_name_pairs.data = rtc::Optional<ChannelNamePair>(ChannelNamePair( |
+ data_channel()->content_name(), data_channel()->transport_name())); |
} |
+ return GetSessionStats(channel_name_pairs); |
pthatcher1
2016/12/15 23:18:59
I don't understand. Why not just put everything i
hbos
2016/12/16 10:38:02
Because what if there is a race between e.g. blah_
|
+} |
- stats->transport_stats[transport_name] = tstats; |
- return true; |
+std::unique_ptr<SessionStats> WebRtcSession::GetSessionStats( |
+ const ChannelNamePairs& channel_name_pairs) { |
+ if (network_thread()->IsCurrent()) |
+ return GetSessionStats_n(channel_name_pairs); |
pthatcher1
2016/12/15 23:18:59
{}s please
hbos
2016/12/16 10:38:02
Done.
|
+ return network_thread()->Invoke<std::unique_ptr<SessionStats>>( |
+ RTC_FROM_HERE, |
+ rtc::Bind(&WebRtcSession::GetSessionStats_n, this, channel_name_pairs)); |
} |
bool WebRtcSession::GetLocalCertificate( |
const std::string& transport_name, |
rtc::scoped_refptr<rtc::RTCCertificate>* certificate) { |
- ASSERT(signaling_thread()->IsCurrent()); |
return transport_controller_->GetLocalCertificate(transport_name, |
certificate); |
} |
std::unique_ptr<rtc::SSLCertificate> WebRtcSession::GetRemoteSSLCertificate( |
const std::string& transport_name) { |
- ASSERT(signaling_thread()->IsCurrent()); |
return transport_controller_->GetRemoteSSLCertificate(transport_name); |
} |
@@ -1749,6 +1741,46 @@ bool WebRtcSession::CreateDataChannel(const cricket::ContentInfo* content, |
return true; |
} |
+std::unique_ptr<SessionStats> WebRtcSession::GetSessionStats_n( |
+ const ChannelNamePairs& channel_name_pairs) { |
+ ASSERT(network_thread()->IsCurrent()); |
+ std::unique_ptr<SessionStats> session_stats(new SessionStats()); |
+ if (channel_name_pairs.voice) { |
+ cricket::TransportStats voice_transport_stats; |
+ if (!transport_controller_->GetStats( |
+ channel_name_pairs.voice->transport_name, &voice_transport_stats)) { |
+ return nullptr; |
+ } |
+ session_stats->proxy_to_transport[channel_name_pairs.voice->content_name] = |
+ channel_name_pairs.voice->transport_name; |
+ session_stats->transport_stats[channel_name_pairs.voice->transport_name] = |
+ std::move(voice_transport_stats); |
+ } |
+ if (channel_name_pairs.video) { |
+ cricket::TransportStats video_transport_stats; |
+ if (!transport_controller_->GetStats( |
+ channel_name_pairs.video->transport_name, &video_transport_stats)) { |
+ return nullptr; |
+ } |
+ session_stats->proxy_to_transport[channel_name_pairs.video->content_name] = |
+ channel_name_pairs.video->transport_name; |
+ session_stats->transport_stats[channel_name_pairs.video->transport_name] = |
+ std::move(video_transport_stats); |
+ } |
+ if (channel_name_pairs.data) { |
+ cricket::TransportStats data_transport_stats; |
+ if (!transport_controller_->GetStats( |
+ channel_name_pairs.data->transport_name, &data_transport_stats)) { |
+ return nullptr; |
+ } |
+ session_stats->proxy_to_transport[channel_name_pairs.data->content_name] = |
+ channel_name_pairs.data->transport_name; |
+ session_stats->transport_stats[channel_name_pairs.data->transport_name] = |
+ std::move(data_transport_stats); |
+ } |
pthatcher1
2016/12/15 23:18:59
There's some duplication that could be removed and
hbos
2016/12/16 10:38:02
Oh nice, good idea. Done.
|
+ return session_stats; |
+} |
+ |
void WebRtcSession::OnDtlsSetupFailure(cricket::BaseChannel*, bool rtcp) { |
SetError(ERROR_TRANSPORT, |
rtcp ? kDtlsSetupFailureRtcp : kDtlsSetupFailureRtp); |