/* * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "webrtc/test/histogram.h" #include #include "webrtc/base/checks.h" #include "webrtc/base/criticalsection.h" #include "webrtc/base/thread_annotations.h" #include "webrtc/system_wrappers/include/metrics.h" // Test implementation of histogram methods in // webrtc/system_wrappers/include/metrics.h. namespace webrtc { namespace { struct SampleInfo { SampleInfo(const std::string& name) : name_(name), last_(-1), total_(0) {} const std::string name_; int last_; // Last added sample. int total_; // Total number of added samples. }; rtc::CriticalSection histogram_crit_; // Map holding info about added samples to a histogram (mapped by the histogram // name). std::map histograms_ GUARDED_BY(histogram_crit_); } // namespace namespace metrics { Histogram* HistogramFactoryGetCounts(const std::string& name, int min, int max, int bucket_count) { rtc::CritScope cs(&histogram_crit_); if (histograms_.find(name) == histograms_.end()) { histograms_.insert(std::make_pair(name, SampleInfo(name))); } auto it = histograms_.find(name); return reinterpret_cast(&it->second); } Histogram* HistogramFactoryGetEnumeration(const std::string& name, int boundary) { rtc::CritScope cs(&histogram_crit_); if (histograms_.find(name) == histograms_.end()) { histograms_.insert(std::make_pair(name, SampleInfo(name))); } auto it = histograms_.find(name); return reinterpret_cast(&it->second); } void HistogramAdd( Histogram* histogram_pointer, const std::string& name, int sample) { rtc::CritScope cs(&histogram_crit_); SampleInfo* ptr = reinterpret_cast(histogram_pointer); // The name should not vary. RTC_CHECK(ptr->name_ == name); ptr->last_ = sample; ++ptr->total_; } } // namespace metrics namespace test { int LastHistogramSample(const std::string& name) { rtc::CritScope cs(&histogram_crit_); const auto it = histograms_.find(name); if (it == histograms_.end()) { return -1; } return it->second.last_; } int NumHistogramSamples(const std::string& name) { rtc::CritScope cs(&histogram_crit_); const auto it = histograms_.find(name); if (it == histograms_.end()) { return 0; } return it->second.total_; } void ClearHistograms() { rtc::CritScope cs(&histogram_crit_); for (auto& it : histograms_) { it.second.last_ = -1; it.second.total_ = 0; } } } // namespace test } // namespace webrtc