| Index: webrtc/api/rtcstatscollector.cc
|
| diff --git a/webrtc/api/rtcstatscollector.cc b/webrtc/api/rtcstatscollector.cc
|
| index a6d691c33339fd453ccf03175017e2422764e840..3628544c15f86250785d98657d9664d11acce136 100644
|
| --- a/webrtc/api/rtcstatscollector.cc
|
| +++ b/webrtc/api/rtcstatscollector.cc
|
| @@ -416,9 +416,32 @@ void RTCStatsCollector::GetStatsReport(
|
| invoker_.AsyncInvoke<void>(RTC_FROM_HERE, signaling_thread_,
|
| rtc::Bind(&RTCStatsCollector::ProducePartialResultsOnSignalingThread,
|
| rtc::scoped_refptr<RTCStatsCollector>(this), timestamp_us));
|
| +
|
| + // TODO(hbos): No stats are gathered by
|
| + // |ProducePartialResultsOnWorkerThread|, remove it.
|
| invoker_.AsyncInvoke<void>(RTC_FROM_HERE, worker_thread_,
|
| rtc::Bind(&RTCStatsCollector::ProducePartialResultsOnWorkerThread,
|
| rtc::scoped_refptr<RTCStatsCollector>(this), timestamp_us));
|
| +
|
| + // Prepare |channel_names_| and |media_info_| for use in
|
| + // |ProducePartialResultsOnNetworkThread|.
|
| + channel_name_pairs_.reset(new ChannelNamePairs());
|
| + if (pc_->session()->voice_channel()) {
|
| + channel_name_pairs_->voice = rtc::Optional<ChannelNamePair>(
|
| + ChannelNamePair(pc_->session()->voice_channel()->content_name(),
|
| + pc_->session()->voice_channel()->transport_name()));
|
| + }
|
| + if (pc_->session()->video_channel()) {
|
| + channel_name_pairs_->video = rtc::Optional<ChannelNamePair>(
|
| + ChannelNamePair(pc_->session()->video_channel()->content_name(),
|
| + pc_->session()->video_channel()->transport_name()));
|
| + }
|
| + if (pc_->session()->data_channel()) {
|
| + channel_name_pairs_->data = rtc::Optional<ChannelNamePair>(
|
| + ChannelNamePair(pc_->session()->data_channel()->content_name(),
|
| + pc_->session()->data_channel()->transport_name()));
|
| + }
|
| + media_info_.reset(PrepareMediaInfo_s().release());
|
| invoker_.AsyncInvoke<void>(RTC_FROM_HERE, network_thread_,
|
| rtc::Bind(&RTCStatsCollector::ProducePartialResultsOnNetworkThread,
|
| rtc::scoped_refptr<RTCStatsCollector>(this), timestamp_us));
|
| @@ -436,23 +459,6 @@ void RTCStatsCollector::ProducePartialResultsOnSignalingThread(
|
| rtc::scoped_refptr<RTCStatsReport> report = RTCStatsReport::Create(
|
| timestamp_us);
|
|
|
| - SessionStats session_stats;
|
| - if (pc_->session()->GetTransportStats(&session_stats)) {
|
| - std::map<std::string, CertificateStatsPair> transport_cert_stats =
|
| - PrepareTransportCertificateStats(session_stats);
|
| - MediaInfo media_info = PrepareMediaInfo(session_stats);
|
| -
|
| - ProduceCertificateStats_s(
|
| - timestamp_us, transport_cert_stats, report.get());
|
| - ProduceCodecStats_s(
|
| - timestamp_us, media_info, report.get());
|
| - ProduceIceCandidateAndPairStats_s(
|
| - timestamp_us, session_stats, report.get());
|
| - ProduceRTPStreamStats_s(
|
| - timestamp_us, session_stats, media_info, report.get());
|
| - ProduceTransportStats_s(
|
| - timestamp_us, session_stats, transport_cert_stats, report.get());
|
| - }
|
| ProduceDataChannelStats_s(timestamp_us, report.get());
|
| ProduceMediaStreamAndTrackStats_s(timestamp_us, report.get());
|
| ProducePeerConnectionStats_s(timestamp_us, report.get());
|
| @@ -466,13 +472,8 @@ void RTCStatsCollector::ProducePartialResultsOnWorkerThread(
|
| rtc::scoped_refptr<RTCStatsReport> report = RTCStatsReport::Create(
|
| timestamp_us);
|
|
|
| - // TODO(hbos): Gather stats on worker thread.
|
| - // pc_->session()'s channels are owned by the signaling thread but there are
|
| - // some stats that are gathered on the worker thread. Instead of a synchronous
|
| - // invoke on "s->w" we could to the "w" work here asynchronously if it wasn't
|
| - // for the ownership issue. Synchronous invokes in other places makes it
|
| - // difficult to introduce locks without introducing deadlocks and the channels
|
| - // are not reference counted.
|
| + // TODO(hbos): There are no stats to be gathered on this thread, remove this
|
| + // method.
|
|
|
| AddPartialResults(report);
|
| }
|
| @@ -483,13 +484,23 @@ void RTCStatsCollector::ProducePartialResultsOnNetworkThread(
|
| rtc::scoped_refptr<RTCStatsReport> report = RTCStatsReport::Create(
|
| timestamp_us);
|
|
|
| - // TODO(hbos): Gather stats on network thread.
|
| - // pc_->session()'s channels are owned by the signaling thread but there are
|
| - // some stats that are gathered on the network thread. Instead of a
|
| - // synchronous invoke on "s->n" we could to the "n" work here asynchronously
|
| - // if it wasn't for the ownership issue. Synchronous invokes in other places
|
| - // makes it difficult to introduce locks without introducing deadlocks and the
|
| - // channels are not reference counted.
|
| + std::unique_ptr<SessionStats> session_stats =
|
| + pc_->session()->GetStats(*channel_name_pairs_);
|
| + if (session_stats) {
|
| + std::map<std::string, CertificateStatsPair> transport_cert_stats =
|
| + PrepareTransportCertificateStats_n(*session_stats);
|
| +
|
| + ProduceCertificateStats_n(
|
| + timestamp_us, transport_cert_stats, report.get());
|
| + ProduceCodecStats_n(
|
| + timestamp_us, *media_info_, report.get());
|
| + ProduceIceCandidateAndPairStats_n(
|
| + timestamp_us, *session_stats, report.get());
|
| + ProduceRTPStreamStats_n(
|
| + timestamp_us, *session_stats, *media_info_, report.get());
|
| + ProduceTransportStats_n(
|
| + timestamp_us, *session_stats, transport_cert_stats, report.get());
|
| + }
|
|
|
| AddPartialResults(report);
|
| }
|
| @@ -534,11 +545,11 @@ void RTCStatsCollector::DeliverCachedReport() {
|
| callbacks_.clear();
|
| }
|
|
|
| -void RTCStatsCollector::ProduceCertificateStats_s(
|
| +void RTCStatsCollector::ProduceCertificateStats_n(
|
| int64_t timestamp_us,
|
| const std::map<std::string, CertificateStatsPair>& transport_cert_stats,
|
| RTCStatsReport* report) const {
|
| - RTC_DCHECK(signaling_thread_->IsCurrent());
|
| + RTC_DCHECK(network_thread_->IsCurrent());
|
| for (const auto& transport_cert_stats_pair : transport_cert_stats) {
|
| if (transport_cert_stats_pair.second.local) {
|
| ProduceCertificateStatsFromSSLCertificateStats(
|
| @@ -551,10 +562,10 @@ void RTCStatsCollector::ProduceCertificateStats_s(
|
| }
|
| }
|
|
|
| -void RTCStatsCollector::ProduceCodecStats_s(
|
| +void RTCStatsCollector::ProduceCodecStats_n(
|
| int64_t timestamp_us, const MediaInfo& media_info,
|
| RTCStatsReport* report) const {
|
| - RTC_DCHECK(signaling_thread_->IsCurrent());
|
| + RTC_DCHECK(network_thread_->IsCurrent());
|
| // Audio
|
| if (media_info.voice) {
|
| // Inbound
|
| @@ -605,10 +616,10 @@ void RTCStatsCollector::ProduceDataChannelStats_s(
|
| }
|
| }
|
|
|
| -void RTCStatsCollector::ProduceIceCandidateAndPairStats_s(
|
| +void RTCStatsCollector::ProduceIceCandidateAndPairStats_n(
|
| int64_t timestamp_us, const SessionStats& session_stats,
|
| RTCStatsReport* report) const {
|
| - RTC_DCHECK(signaling_thread_->IsCurrent());
|
| + RTC_DCHECK(network_thread_->IsCurrent());
|
| for (const auto& transport_stats : session_stats.transport_stats) {
|
| for (const auto& channel_stats : transport_stats.second.channel_stats) {
|
| std::string transport_id = RTCTransportStatsIDFromTransportChannel(
|
| @@ -681,10 +692,10 @@ void RTCStatsCollector::ProducePeerConnectionStats_s(
|
| report->AddStats(std::move(stats));
|
| }
|
|
|
| -void RTCStatsCollector::ProduceRTPStreamStats_s(
|
| +void RTCStatsCollector::ProduceRTPStreamStats_n(
|
| int64_t timestamp_us, const SessionStats& session_stats,
|
| const MediaInfo& media_info, RTCStatsReport* report) const {
|
| - RTC_DCHECK(signaling_thread_->IsCurrent());
|
| + RTC_DCHECK(network_thread_->IsCurrent());
|
|
|
| // Audio
|
| if (media_info.voice) {
|
| @@ -788,11 +799,11 @@ void RTCStatsCollector::ProduceRTPStreamStats_s(
|
| }
|
| }
|
|
|
| -void RTCStatsCollector::ProduceTransportStats_s(
|
| +void RTCStatsCollector::ProduceTransportStats_n(
|
| int64_t timestamp_us, const SessionStats& session_stats,
|
| const std::map<std::string, CertificateStatsPair>& transport_cert_stats,
|
| RTCStatsReport* report) const {
|
| - RTC_DCHECK(signaling_thread_->IsCurrent());
|
| + RTC_DCHECK(network_thread_->IsCurrent());
|
| for (const auto& transport : session_stats.transport_stats) {
|
| // Get reference to RTCP channel, if it exists.
|
| std::string rtcp_transport_stats_id;
|
| @@ -855,9 +866,9 @@ void RTCStatsCollector::ProduceTransportStats_s(
|
| }
|
|
|
| std::map<std::string, RTCStatsCollector::CertificateStatsPair>
|
| -RTCStatsCollector::PrepareTransportCertificateStats(
|
| +RTCStatsCollector::PrepareTransportCertificateStats_n(
|
| const SessionStats& session_stats) const {
|
| - RTC_DCHECK(signaling_thread_->IsCurrent());
|
| + RTC_DCHECK(network_thread_->IsCurrent());
|
| std::map<std::string, CertificateStatsPair> transport_cert_stats;
|
| for (const auto& transport_stats : session_stats.transport_stats) {
|
| CertificateStatsPair certificate_stats_pair;
|
| @@ -880,20 +891,21 @@ RTCStatsCollector::PrepareTransportCertificateStats(
|
| return transport_cert_stats;
|
| }
|
|
|
| -RTCStatsCollector::MediaInfo RTCStatsCollector::PrepareMediaInfo(
|
| - const SessionStats& session_stats) const {
|
| - MediaInfo media_info;
|
| +std::unique_ptr<RTCStatsCollector::MediaInfo>
|
| +RTCStatsCollector::PrepareMediaInfo_s() const {
|
| + RTC_DCHECK(signaling_thread_->IsCurrent());
|
| + std::unique_ptr<MediaInfo> media_info(new MediaInfo());
|
| if (pc_->session()->voice_channel()) {
|
| cricket::VoiceMediaInfo voice_media_info;
|
| if (pc_->session()->voice_channel()->GetStats(&voice_media_info)) {
|
| - media_info.voice = rtc::Optional<cricket::VoiceMediaInfo>(
|
| + media_info->voice = rtc::Optional<cricket::VoiceMediaInfo>(
|
| std::move(voice_media_info));
|
| }
|
| }
|
| if (pc_->session()->video_channel()) {
|
| cricket::VideoMediaInfo video_media_info;
|
| if (pc_->session()->video_channel()->GetStats(&video_media_info)) {
|
| - media_info.video = rtc::Optional<cricket::VideoMediaInfo>(
|
| + media_info->video = rtc::Optional<cricket::VideoMediaInfo>(
|
| std::move(video_media_info));
|
| }
|
| }
|
|
|