RTCStatsCollector: Remove closed channels from opened set.

This is a problem if a data channel is re-opened or a new data channel
occupies the same space in memory as a previously closed data channel.

Unittest updated to cover this (failed before fix, now passes).

BUG=webrtc:7181

Review-Url: https://codereview.webrtc.org/2746393003
Cr-Commit-Position: refs/heads/master@{#17304}
This commit is contained in:
hbos 2017-03-20 03:14:14 -07:00 committed by Commit bot
parent 1973ba6ef4
commit 5bf9def61b
2 changed files with 35 additions and 3 deletions

View File

@ -1235,9 +1235,8 @@ void RTCStatsCollector::OnDataChannelClosed(DataChannel* channel) {
RTC_DCHECK(signaling_thread_->IsCurrent());
// Only channels that have been fully opened (and have increased the
// |data_channels_opened_| counter) increase the closed counter.
if (internal_record_.opened_data_channels.find(
reinterpret_cast<uintptr_t>(channel)) !=
internal_record_.opened_data_channels.end()) {
if (internal_record_.opened_data_channels.erase(
reinterpret_cast<uintptr_t>(channel))) {
++internal_record_.data_channels_closed;
}
}

View File

@ -1463,6 +1463,39 @@ TEST_F(RTCStatsCollectorTest, CollectRTCPeerConnectionStats) {
report->Get("RTCPeerConnection")->cast_to<
RTCPeerConnectionStats>());
}
// Re-opening a data channel (or opening a new data channel that is re-using
// the same address in memory) should increase the opened count.
dummy_channel_b->SignalOpened(dummy_channel_b.get());
{
collector_->ClearCachedStatsReport();
rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
RTCPeerConnectionStats expected("RTCPeerConnection",
report->timestamp_us());
expected.data_channels_opened = 3;
expected.data_channels_closed = 1;
ASSERT_TRUE(report->Get("RTCPeerConnection"));
EXPECT_EQ(expected,
report->Get("RTCPeerConnection")->cast_to<
RTCPeerConnectionStats>());
}
dummy_channel_a->SignalClosed(dummy_channel_a.get());
dummy_channel_b->SignalClosed(dummy_channel_b.get());
{
collector_->ClearCachedStatsReport();
rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
RTCPeerConnectionStats expected("RTCPeerConnection",
report->timestamp_us());
expected.data_channels_opened = 3;
expected.data_channels_closed = 3;
ASSERT_TRUE(report->Get("RTCPeerConnection"));
EXPECT_EQ(expected,
report->Get("RTCPeerConnection")->cast_to<
RTCPeerConnectionStats>());
}
}
TEST_F(RTCStatsCollectorTest,