diff --git a/webrtc/system_wrappers/source/metrics_default.cc b/webrtc/system_wrappers/source/metrics_default.cc index 8ee10bacbc..d7d24fa50d 100644 --- a/webrtc/system_wrappers/source/metrics_default.cc +++ b/webrtc/system_wrappers/source/metrics_default.cc @@ -9,6 +9,8 @@ #include "webrtc/system_wrappers/include/metrics_default.h" +#include + #include "webrtc/base/criticalsection.h" #include "webrtc/base/thread_annotations.h" #include "webrtc/system_wrappers/include/metrics.h" @@ -34,10 +36,8 @@ class RtcHistogram { } void Add(int sample) { - if (sample < min_) - sample = min_ - 1; // Underflow bucket. - if (sample > max_) - sample = max_; + sample = std::min(sample, max_); + sample = std::max(sample, min_ - 1); // Underflow bucket. rtc::CritScope cs(&crit_); if (info_.samples.size() == kMaxSampleMapSize && @@ -55,8 +55,9 @@ class RtcHistogram { SampleInfo* copy = new SampleInfo(info_.name, info_.min, info_.max, info_.bucket_count); - copy->samples = info_.samples; - info_.samples.clear(); + + std::swap(info_.samples, copy->samples); + return std::unique_ptr(copy); } diff --git a/webrtc/system_wrappers/source/metrics_default_unittest.cc b/webrtc/system_wrappers/source/metrics_default_unittest.cc index c2eefe5563..0414bc78f4 100644 --- a/webrtc/system_wrappers/source/metrics_default_unittest.cc +++ b/webrtc/system_wrappers/source/metrics_default_unittest.cc @@ -134,6 +134,16 @@ TEST_F(MetricsDefaultTest, GetAndReset) { EXPECT_EQ(1, NumEvents("Histogram1", 4, histograms)); EXPECT_EQ(2, NumEvents("Histogram1", 5, histograms)); EXPECT_EQ(1, NumEvents("Histogram2", 10, histograms)); + + // Add samples after reset. + metrics::GetAndReset(&histograms); + EXPECT_EQ(0u, histograms.size()); + RTC_HISTOGRAM_PERCENTAGE("Histogram1", 50); + RTC_HISTOGRAM_PERCENTAGE("Histogram2", 8); + EXPECT_EQ(1, metrics::NumSamples("Histogram1")); + EXPECT_EQ(1, metrics::NumSamples("Histogram2")); + EXPECT_EQ(1, metrics::NumEvents("Histogram1", 50)); + EXPECT_EQ(1, metrics::NumEvents("Histogram2", 8)); } TEST_F(MetricsDefaultTest, TestMinMaxBucket) { diff --git a/webrtc/system_wrappers/source/metrics_unittest.cc b/webrtc/system_wrappers/source/metrics_unittest.cc index 95f5554275..d7be2297f8 100644 --- a/webrtc/system_wrappers/source/metrics_unittest.cc +++ b/webrtc/system_wrappers/source/metrics_unittest.cc @@ -58,6 +58,14 @@ TEST_F(MetricsTest, RtcHistogramEnumeration_AddSample) { EXPECT_EQ(1, metrics::NumEvents(kName, kSample)); } +TEST_F(MetricsTest, RtcHistogramBoolean_AddSample) { + const std::string kName = "Boolean"; + const int kSample = 0; + RTC_HISTOGRAM_BOOLEAN(kName, kSample); + EXPECT_EQ(1, metrics::NumSamples(kName)); + EXPECT_EQ(1, metrics::NumEvents(kName, kSample)); +} + TEST_F(MetricsTest, RtcHistogramCountsSparse_AddSample) { const std::string kName = "CountsSparse100"; RTC_HISTOGRAM_COUNTS_SPARSE_100(kName, kSample);