Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(369)

Side by Side Diff: base/metrics/statistics_recorder.h

Issue 1425533011: Support "shared" histograms between processes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@shmem-alloc
Patch Set: addressed review comments by Alexei Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // StatisticsRecorder holds all Histograms and BucketRanges that are used by 5 // StatisticsRecorder holds all Histograms and BucketRanges that are used by
6 // Histograms in the system. It provides a general place for 6 // Histograms in the system. It provides a general place for
7 // Histograms/BucketRanges to register, and supports a global API for accessing 7 // Histograms/BucketRanges to register, and supports a global API for accessing
8 // (i.e., dumping, or graphing) the data. 8 // (i.e., dumping, or graphing) the data.
9 9
10 #ifndef BASE_METRICS_STATISTICS_RECORDER_H_ 10 #ifndef BASE_METRICS_STATISTICS_RECORDER_H_
(...skipping 12 matching lines...) Expand all
23 #include "base/lazy_instance.h" 23 #include "base/lazy_instance.h"
24 #include "base/macros.h" 24 #include "base/macros.h"
25 #include "base/metrics/histogram_base.h" 25 #include "base/metrics/histogram_base.h"
26 26
27 namespace base { 27 namespace base {
28 28
29 class BucketRanges; 29 class BucketRanges;
30 class Lock; 30 class Lock;
31 31
32 class BASE_EXPORT StatisticsRecorder { 32 class BASE_EXPORT StatisticsRecorder {
33 // We keep all registered histograms in a map, indexed by the hash of the
34 // name of the histogram.
35 typedef std::map<uint64_t, HistogramBase*> HistogramMap;
36
33 public: 37 public:
34 typedef std::vector<HistogramBase*> Histograms; 38 typedef std::vector<HistogramBase*> Histograms;
35 39
40 // A class for iterating over the histograms held within this global resource.
41 class BASE_EXPORT HistogramIterator {
42 public:
43 HistogramIterator(HistogramMap::iterator iter, bool include_persistent)
44 : iter_(iter),
45 include_persistent_(include_persistent) {}
46
47 HistogramIterator& operator++();
48 HistogramIterator operator++(int) {
49 HistogramIterator tmp(*this);
50 operator++();
51 return tmp;
52 }
53
54 bool operator==(const HistogramIterator& rhs) const {
55 return iter_ == rhs.iter_;
56 }
57 bool operator!=(const HistogramIterator& rhs) const {
58 return iter_ != rhs.iter_;
59 }
60 HistogramBase* operator*() { return iter_->second; }
61
62 private:
63 HistogramMap::iterator iter_;
64 const bool include_persistent_;
65 };
66
36 // Initializes the StatisticsRecorder system. Safe to call multiple times. 67 // Initializes the StatisticsRecorder system. Safe to call multiple times.
37 static void Initialize(); 68 static void Initialize();
38 69
39 // Find out if histograms can now be registered into our list. 70 // Find out if histograms can now be registered into our list.
40 static bool IsActive(); 71 static bool IsActive();
41 72
42 // Register, or add a new histogram to the collection of statistics. If an 73 // Register, or add a new histogram to the collection of statistics. If an
43 // identically named histogram is already registered, then the argument 74 // identically named histogram is already registered, then the argument
44 // |histogram| will deleted. The returned value is always the registered 75 // |histogram| will deleted. The returned value is always the registered
45 // histogram (either the argument, or the pre-existing registered histogram). 76 // histogram (either the argument, or the pre-existing registered histogram).
(...skipping 19 matching lines...) Expand all
65 // Method for extracting histograms which were marked for use by UMA. 96 // Method for extracting histograms which were marked for use by UMA.
66 static void GetHistograms(Histograms* output); 97 static void GetHistograms(Histograms* output);
67 98
68 // Method for extracting BucketRanges used by all histograms registered. 99 // Method for extracting BucketRanges used by all histograms registered.
69 static void GetBucketRanges(std::vector<const BucketRanges*>* output); 100 static void GetBucketRanges(std::vector<const BucketRanges*>* output);
70 101
71 // Find a histogram by name. It matches the exact name. This method is thread 102 // Find a histogram by name. It matches the exact name. This method is thread
72 // safe. It returns NULL if a matching histogram is not found. 103 // safe. It returns NULL if a matching histogram is not found.
73 static HistogramBase* FindHistogram(const std::string& name); 104 static HistogramBase* FindHistogram(const std::string& name);
74 105
106 // Support for iterating over known histograms.
107 static HistogramIterator begin(bool include_persistent);
108 static HistogramIterator end();
109
75 // GetSnapshot copies some of the pointers to registered histograms into the 110 // GetSnapshot copies some of the pointers to registered histograms into the
76 // caller supplied vector (Histograms). Only histograms which have |query| as 111 // caller supplied vector (Histograms). Only histograms which have |query| as
77 // a substring are copied (an empty string will process all registered 112 // a substring are copied (an empty string will process all registered
78 // histograms). 113 // histograms).
79 static void GetSnapshot(const std::string& query, Histograms* snapshot); 114 static void GetSnapshot(const std::string& query, Histograms* snapshot);
80 115
81 typedef base::Callback<void(HistogramBase::Sample)> OnSampleCallback; 116 typedef base::Callback<void(HistogramBase::Sample)> OnSampleCallback;
82 117
83 // SetCallback sets the callback to notify when a new sample is recorded on 118 // SetCallback sets the callback to notify when a new sample is recorded on
84 // the histogram referred to by |histogram_name|. The call to this method can 119 // the histogram referred to by |histogram_name|. The call to this method can
85 // be be done before or after the histogram is created. This method is thread 120 // be be done before or after the histogram is created. This method is thread
86 // safe. The return value is whether or not the callback was successfully set. 121 // safe. The return value is whether or not the callback was successfully set.
87 static bool SetCallback(const std::string& histogram_name, 122 static bool SetCallback(const std::string& histogram_name,
88 const OnSampleCallback& callback); 123 const OnSampleCallback& callback);
89 124
90 // ClearCallback clears any callback set on the histogram referred to by 125 // ClearCallback clears any callback set on the histogram referred to by
91 // |histogram_name|. This method is thread safe. 126 // |histogram_name|. This method is thread safe.
92 static void ClearCallback(const std::string& histogram_name); 127 static void ClearCallback(const std::string& histogram_name);
93 128
94 // FindCallback retrieves the callback for the histogram referred to by 129 // FindCallback retrieves the callback for the histogram referred to by
95 // |histogram_name|, or a null callback if no callback exists for this 130 // |histogram_name|, or a null callback if no callback exists for this
96 // histogram. This method is thread safe. 131 // histogram. This method is thread safe.
97 static OnSampleCallback FindCallback(const std::string& histogram_name); 132 static OnSampleCallback FindCallback(const std::string& histogram_name);
98 133
99 private: 134 private:
100 // We keep all registered histograms in a map, indexed by the hash of the
101 // name of the histogram.
102 typedef std::map<uint64_t, HistogramBase*> HistogramMap;
103
104 // We keep a map of callbacks to histograms, so that as histograms are 135 // We keep a map of callbacks to histograms, so that as histograms are
105 // created, we can set the callback properly. 136 // created, we can set the callback properly.
106 typedef std::map<std::string, OnSampleCallback> CallbackMap; 137 typedef std::map<std::string, OnSampleCallback> CallbackMap;
107 138
108 // We keep all |bucket_ranges_| in a map, from checksum to a list of 139 // We keep all |bucket_ranges_| in a map, from checksum to a list of
109 // |bucket_ranges_|. Checksum is calculated from the |ranges_| in 140 // |bucket_ranges_|. Checksum is calculated from the |ranges_| in
110 // |bucket_ranges_|. 141 // |bucket_ranges_|.
111 typedef std::map<uint32_t, std::list<const BucketRanges*>*> RangesMap; 142 typedef std::map<uint32_t, std::list<const BucketRanges*>*> RangesMap;
112 143
113 friend struct DefaultLazyInstanceTraits<StatisticsRecorder>; 144 friend struct DefaultLazyInstanceTraits<StatisticsRecorder>;
114 friend class HistogramBaseTest; 145 friend class HistogramBaseTest;
115 friend class HistogramSnapshotManagerTest; 146 friend class HistogramSnapshotManagerTest;
116 friend class HistogramTest; 147 friend class HistogramTest;
117 friend class JsonPrefStoreTest; 148 friend class JsonPrefStoreTest;
149 friend class SharedHistogramTest;
118 friend class SparseHistogramTest; 150 friend class SparseHistogramTest;
119 friend class StatisticsRecorderTest; 151 friend class StatisticsRecorderTest;
120 FRIEND_TEST_ALL_PREFIXES(HistogramDeltaSerializationTest, 152 FRIEND_TEST_ALL_PREFIXES(HistogramDeltaSerializationTest,
121 DeserializeHistogramAndAddSamples); 153 DeserializeHistogramAndAddSamples);
122 154
123 // The constructor just initializes static members. Usually client code should 155 // The constructor just initializes static members. Usually client code should
124 // use Initialize to do this. But in test code, you can friend this class and 156 // use Initialize to do this. But in test code, you can friend this class and
125 // call destructor/constructor to get a clean StatisticsRecorder. 157 // call destructor/constructor to get a clean StatisticsRecorder.
126 StatisticsRecorder(); 158 StatisticsRecorder();
127 ~StatisticsRecorder(); 159 ~StatisticsRecorder();
128 160
129 static void DumpHistogramsToVlog(void* instance); 161 static void DumpHistogramsToVlog(void* instance);
130 162
131 static HistogramMap* histograms_; 163 static HistogramMap* histograms_;
132 static CallbackMap* callbacks_; 164 static CallbackMap* callbacks_;
133 static RangesMap* ranges_; 165 static RangesMap* ranges_;
134 166
135 // Lock protects access to above maps. 167 // Lock protects access to above maps.
136 static base::Lock* lock_; 168 static base::Lock* lock_;
137 169
138 DISALLOW_COPY_AND_ASSIGN(StatisticsRecorder); 170 DISALLOW_COPY_AND_ASSIGN(StatisticsRecorder);
139 }; 171 };
140 172
141 } // namespace base 173 } // namespace base
142 174
143 #endif // BASE_METRICS_STATISTICS_RECORDER_H_ 175 #endif // BASE_METRICS_STATISTICS_RECORDER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698