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

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: fixed compile problems on non-Windows builds 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 13 matching lines...) Expand all
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 public: 33 public:
34 typedef std::map<uint64_t, HistogramBase*> HistogramMap; // Key is name-hash.
34 typedef std::vector<HistogramBase*> Histograms; 35 typedef std::vector<HistogramBase*> Histograms;
35 36
37 // A class for iterating over the histograms held within this global resource.
38 class BASE_EXPORT HistogramIterator {
39 public:
40 HistogramIterator(const HistogramMap::iterator& iter,
41 bool include_persistent);
42
43 // STL Iterators must be copyable.
44 HistogramIterator(const HistogramIterator& rhs);
45
46 HistogramIterator& operator++();
47 HistogramIterator operator++(int) {
48 HistogramIterator tmp(*this);
49 operator++();
50 return tmp;
51 }
52
53 bool operator==(const HistogramIterator& rhs) const {
54 return iter_ == rhs.iter_;
55 }
56 bool operator!=(const HistogramIterator& rhs) const {
57 return iter_ != rhs.iter_;
58 }
59 HistogramBase* operator*() { return iter_->second; }
60
61 private:
62 HistogramMap::iterator iter_;
63 const bool include_persistent_;
64 };
65
36 // Initializes the StatisticsRecorder system. Safe to call multiple times. 66 // Initializes the StatisticsRecorder system. Safe to call multiple times.
37 static void Initialize(); 67 static void Initialize();
38 68
39 // Find out if histograms can now be registered into our list. 69 // Find out if histograms can now be registered into our list.
40 static bool IsActive(); 70 static bool IsActive();
41 71
42 // Register, or add a new histogram to the collection of statistics. If an 72 // Register, or add a new histogram to the collection of statistics. If an
43 // identically named histogram is already registered, then the argument 73 // identically named histogram is already registered, then the argument
44 // |histogram| will deleted. The returned value is always the registered 74 // |histogram| will deleted. The returned value is always the registered
45 // histogram (either the argument, or the pre-existing registered histogram). 75 // 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. 95 // Method for extracting histograms which were marked for use by UMA.
66 static void GetHistograms(Histograms* output); 96 static void GetHistograms(Histograms* output);
67 97
68 // Method for extracting BucketRanges used by all histograms registered. 98 // Method for extracting BucketRanges used by all histograms registered.
69 static void GetBucketRanges(std::vector<const BucketRanges*>* output); 99 static void GetBucketRanges(std::vector<const BucketRanges*>* output);
70 100
71 // Find a histogram by name. It matches the exact name. This method is thread 101 // 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. 102 // safe. It returns NULL if a matching histogram is not found.
73 static HistogramBase* FindHistogram(const std::string& name); 103 static HistogramBase* FindHistogram(const std::string& name);
74 104
105 // Support for iterating over known histograms.
106 static HistogramIterator begin(bool include_persistent);
107 static HistogramIterator end();
108
75 // GetSnapshot copies some of the pointers to registered histograms into the 109 // GetSnapshot copies some of the pointers to registered histograms into the
76 // caller supplied vector (Histograms). Only histograms which have |query| as 110 // caller supplied vector (Histograms). Only histograms which have |query| as
77 // a substring are copied (an empty string will process all registered 111 // a substring are copied (an empty string will process all registered
78 // histograms). 112 // histograms).
79 static void GetSnapshot(const std::string& query, Histograms* snapshot); 113 static void GetSnapshot(const std::string& query, Histograms* snapshot);
80 114
81 typedef base::Callback<void(HistogramBase::Sample)> OnSampleCallback; 115 typedef base::Callback<void(HistogramBase::Sample)> OnSampleCallback;
82 116
83 // SetCallback sets the callback to notify when a new sample is recorded on 117 // 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 118 // 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 119 // 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. 120 // safe. The return value is whether or not the callback was successfully set.
87 static bool SetCallback(const std::string& histogram_name, 121 static bool SetCallback(const std::string& histogram_name,
88 const OnSampleCallback& callback); 122 const OnSampleCallback& callback);
89 123
90 // ClearCallback clears any callback set on the histogram referred to by 124 // ClearCallback clears any callback set on the histogram referred to by
91 // |histogram_name|. This method is thread safe. 125 // |histogram_name|. This method is thread safe.
92 static void ClearCallback(const std::string& histogram_name); 126 static void ClearCallback(const std::string& histogram_name);
93 127
94 // FindCallback retrieves the callback for the histogram referred to by 128 // FindCallback retrieves the callback for the histogram referred to by
95 // |histogram_name|, or a null callback if no callback exists for this 129 // |histogram_name|, or a null callback if no callback exists for this
96 // histogram. This method is thread safe. 130 // histogram. This method is thread safe.
97 static OnSampleCallback FindCallback(const std::string& histogram_name); 131 static OnSampleCallback FindCallback(const std::string& histogram_name);
98 132
99 private: 133 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 134 // We keep a map of callbacks to histograms, so that as histograms are
105 // created, we can set the callback properly. 135 // created, we can set the callback properly.
106 typedef std::map<std::string, OnSampleCallback> CallbackMap; 136 typedef std::map<std::string, OnSampleCallback> CallbackMap;
107 137
108 // We keep all |bucket_ranges_| in a map, from checksum to a list of 138 // We keep all |bucket_ranges_| in a map, from checksum to a list of
109 // |bucket_ranges_|. Checksum is calculated from the |ranges_| in 139 // |bucket_ranges_|. Checksum is calculated from the |ranges_| in
110 // |bucket_ranges_|. 140 // |bucket_ranges_|.
111 typedef std::map<uint32_t, std::list<const BucketRanges*>*> RangesMap; 141 typedef std::map<uint32_t, std::list<const BucketRanges*>*> RangesMap;
112 142
113 friend struct DefaultLazyInstanceTraits<StatisticsRecorder>; 143 friend struct DefaultLazyInstanceTraits<StatisticsRecorder>;
114 friend class HistogramBaseTest; 144 friend class HistogramBaseTest;
115 friend class HistogramSnapshotManagerTest; 145 friend class HistogramSnapshotManagerTest;
116 friend class HistogramTest; 146 friend class HistogramTest;
117 friend class JsonPrefStoreTest; 147 friend class JsonPrefStoreTest;
148 friend class SharedHistogramTest;
118 friend class SparseHistogramTest; 149 friend class SparseHistogramTest;
119 friend class StatisticsRecorderTest; 150 friend class StatisticsRecorderTest;
120 FRIEND_TEST_ALL_PREFIXES(HistogramDeltaSerializationTest, 151 FRIEND_TEST_ALL_PREFIXES(HistogramDeltaSerializationTest,
121 DeserializeHistogramAndAddSamples); 152 DeserializeHistogramAndAddSamples);
122 153
123 // The constructor just initializes static members. Usually client code should 154 // 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 155 // use Initialize to do this. But in test code, you can friend this class and
125 // call destructor/constructor to get a clean StatisticsRecorder. 156 // call destructor/constructor to get a clean StatisticsRecorder.
126 StatisticsRecorder(); 157 StatisticsRecorder();
127 ~StatisticsRecorder(); 158 ~StatisticsRecorder();
128 159
129 static void DumpHistogramsToVlog(void* instance); 160 static void DumpHistogramsToVlog(void* instance);
130 161
131 static HistogramMap* histograms_; 162 static HistogramMap* histograms_;
132 static CallbackMap* callbacks_; 163 static CallbackMap* callbacks_;
133 static RangesMap* ranges_; 164 static RangesMap* ranges_;
134 165
135 // Lock protects access to above maps. 166 // Lock protects access to above maps.
136 static base::Lock* lock_; 167 static base::Lock* lock_;
137 168
138 DISALLOW_COPY_AND_ASSIGN(StatisticsRecorder); 169 DISALLOW_COPY_AND_ASSIGN(StatisticsRecorder);
139 }; 170 };
140 171
141 } // namespace base 172 } // namespace base
142 173
143 #endif // BASE_METRICS_STATISTICS_RECORDER_H_ 174 #endif // BASE_METRICS_STATISTICS_RECORDER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698