• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "webrtc/test/histogram.h"
12 
13 #include <map>
14 
15 #include "webrtc/base/checks.h"
16 #include "webrtc/base/criticalsection.h"
17 #include "webrtc/base/thread_annotations.h"
18 #include "webrtc/system_wrappers/include/metrics.h"
19 
20 // Test implementation of histogram methods in
21 // webrtc/system_wrappers/include/metrics.h.
22 
23 namespace webrtc {
24 namespace {
25 struct SampleInfo {
SampleInfowebrtc::__anonb77ed5ad0111::SampleInfo26   SampleInfo(const std::string& name) : name_(name), last_(-1), total_(0) {}
27   const std::string name_;
28   int last_;   // Last added sample.
29   int total_;  // Total number of added samples.
30 };
31 
32 rtc::CriticalSection histogram_crit_;
33 // Map holding info about added samples to a histogram (mapped by the histogram
34 // name).
35 std::map<std::string, SampleInfo> histograms_ GUARDED_BY(histogram_crit_);
36 }  // namespace
37 
38 namespace metrics {
HistogramFactoryGetCounts(const std::string & name,int min,int max,int bucket_count)39 Histogram* HistogramFactoryGetCounts(const std::string& name, int min, int max,
40                                      int bucket_count) {
41   rtc::CritScope cs(&histogram_crit_);
42   if (histograms_.find(name) == histograms_.end()) {
43     histograms_.insert(std::make_pair(name, SampleInfo(name)));
44   }
45   auto it = histograms_.find(name);
46   return reinterpret_cast<Histogram*>(&it->second);
47 }
48 
HistogramFactoryGetEnumeration(const std::string & name,int boundary)49 Histogram* HistogramFactoryGetEnumeration(const std::string& name,
50                                           int boundary) {
51   rtc::CritScope cs(&histogram_crit_);
52   if (histograms_.find(name) == histograms_.end()) {
53     histograms_.insert(std::make_pair(name, SampleInfo(name)));
54   }
55   auto it = histograms_.find(name);
56   return reinterpret_cast<Histogram*>(&it->second);
57 }
58 
HistogramAdd(Histogram * histogram_pointer,const std::string & name,int sample)59 void HistogramAdd(
60     Histogram* histogram_pointer, const std::string& name, int sample) {
61   rtc::CritScope cs(&histogram_crit_);
62   SampleInfo* ptr = reinterpret_cast<SampleInfo*>(histogram_pointer);
63   // The name should not vary.
64   RTC_CHECK(ptr->name_ == name);
65   ptr->last_ = sample;
66   ++ptr->total_;
67 }
68 }  // namespace metrics
69 
70 namespace test {
LastHistogramSample(const std::string & name)71 int LastHistogramSample(const std::string& name) {
72   rtc::CritScope cs(&histogram_crit_);
73   const auto it = histograms_.find(name);
74   if (it == histograms_.end()) {
75     return -1;
76   }
77   return it->second.last_;
78 }
79 
NumHistogramSamples(const std::string & name)80 int NumHistogramSamples(const std::string& name) {
81   rtc::CritScope cs(&histogram_crit_);
82   const auto it = histograms_.find(name);
83   if (it == histograms_.end()) {
84     return 0;
85   }
86   return it->second.total_;
87 }
88 
ClearHistograms()89 void ClearHistograms() {
90   rtc::CritScope cs(&histogram_crit_);
91   for (auto& it : histograms_) {
92     it.second.last_ = -1;
93     it.second.total_ = 0;
94   }
95 }
96 }  // namespace test
97 }  // namespace webrtc
98