OLD | NEW |
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 #include "base/metrics/sparse_histogram.h" | 5 #include "base/metrics/sparse_histogram.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
10 #include "base/metrics/metrics_hashes.h" | 10 #include "base/metrics/metrics_hashes.h" |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 void SparseHistogram::AddSamples(const HistogramSamples& samples) { | 139 void SparseHistogram::AddSamples(const HistogramSamples& samples) { |
140 base::AutoLock auto_lock(lock_); | 140 base::AutoLock auto_lock(lock_); |
141 samples_->Add(samples); | 141 samples_->Add(samples); |
142 } | 142 } |
143 | 143 |
144 bool SparseHistogram::AddSamplesFromPickle(PickleIterator* iter) { | 144 bool SparseHistogram::AddSamplesFromPickle(PickleIterator* iter) { |
145 base::AutoLock auto_lock(lock_); | 145 base::AutoLock auto_lock(lock_); |
146 return samples_->AddFromPickle(iter); | 146 return samples_->AddFromPickle(iter); |
147 } | 147 } |
148 | 148 |
149 void SparseHistogram::WriteHTMLGraph(std::string* output) const { | 149 void SparseHistogram::WriteHTMLGraph(const HistogramSamples* snapshot, |
| 150 std::string* output) const { |
150 output->append("<PRE>"); | 151 output->append("<PRE>"); |
151 WriteAsciiImpl(true, "<br>", output); | 152 WriteAsciiImpl(true, "<br>", snapshot, output); |
152 output->append("</PRE>"); | 153 output->append("</PRE>"); |
153 } | 154 } |
154 | 155 |
155 void SparseHistogram::WriteAscii(std::string* output) const { | 156 void SparseHistogram::WriteAscii(const HistogramSamples* snapshot, |
156 WriteAsciiImpl(true, "\n", output); | 157 std::string* output) const { |
| 158 WriteAsciiImpl(true, "\n", snapshot, output); |
157 } | 159 } |
158 | 160 |
159 bool SparseHistogram::SerializeInfoImpl(Pickle* pickle) const { | 161 bool SparseHistogram::SerializeInfoImpl(Pickle* pickle) const { |
160 return pickle->WriteString(histogram_name()) && pickle->WriteInt(flags()); | 162 return pickle->WriteString(histogram_name()) && pickle->WriteInt(flags()); |
161 } | 163 } |
162 | 164 |
163 SparseHistogram::SparseHistogram(const std::string& name) | 165 SparseHistogram::SparseHistogram(const std::string& name) |
164 : HistogramBase(name), | 166 : HistogramBase(name), |
165 samples_(new SampleMap(HashMetricName(name))), | 167 samples_(new SampleMap(HashMetricName(name))), |
166 logged_samples_(new SampleMap(samples_->id())) {} | 168 logged_samples_(new SampleMap(samples_->id())) {} |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 } | 206 } |
205 | 207 |
206 void SparseHistogram::GetCountAndBucketData(Count* count, | 208 void SparseHistogram::GetCountAndBucketData(Count* count, |
207 int64_t* sum, | 209 int64_t* sum, |
208 ListValue* buckets) const { | 210 ListValue* buckets) const { |
209 // TODO(kaiwang): Implement. (See HistogramBase::WriteJSON.) | 211 // TODO(kaiwang): Implement. (See HistogramBase::WriteJSON.) |
210 } | 212 } |
211 | 213 |
212 void SparseHistogram::WriteAsciiImpl(bool graph_it, | 214 void SparseHistogram::WriteAsciiImpl(bool graph_it, |
213 const std::string& newline, | 215 const std::string& newline, |
| 216 const HistogramSamples* snapshot, |
214 std::string* output) const { | 217 std::string* output) const { |
215 // Get a local copy of the data so we are consistent. | 218 std::unique_ptr<HistogramSamples> local_snapshot; |
216 std::unique_ptr<HistogramSamples> snapshot = SnapshotSamples(); | 219 if (!snapshot) { |
| 220 // Get local (stack) copies of all effectively volatile class data so |
| 221 // that we are consistent across our output activities. |
| 222 local_snapshot = SnapshotSamples(); |
| 223 snapshot = local_snapshot.get(); |
| 224 } |
217 Count total_count = snapshot->TotalCount(); | 225 Count total_count = snapshot->TotalCount(); |
218 double scaled_total_count = total_count / 100.0; | 226 double scaled_total_count = total_count / 100.0; |
219 | 227 |
220 WriteAsciiHeader(total_count, output); | 228 WriteAsciiHeader(total_count, output); |
221 output->append(newline); | 229 output->append(newline); |
222 | 230 |
223 // Determine how wide the largest bucket range is (how many digits to print), | 231 // Determine how wide the largest bucket range is (how many digits to print), |
224 // so that we'll be able to right-align starts for the graphical bars. | 232 // so that we'll be able to right-align starts for the graphical bars. |
225 // Determine which bucket has the largest sample count so that we can | 233 // Determine which bucket has the largest sample count so that we can |
226 // normalize the graphical bar-width relative to that sample count. | 234 // normalize the graphical bar-width relative to that sample count. |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 std::string* output) const { | 274 std::string* output) const { |
267 StringAppendF(output, | 275 StringAppendF(output, |
268 "Histogram: %s recorded %d samples", | 276 "Histogram: %s recorded %d samples", |
269 histogram_name().c_str(), | 277 histogram_name().c_str(), |
270 total_count); | 278 total_count); |
271 if (flags() & ~kHexRangePrintingFlag) | 279 if (flags() & ~kHexRangePrintingFlag) |
272 StringAppendF(output, " (flags = 0x%x)", flags() & ~kHexRangePrintingFlag); | 280 StringAppendF(output, " (flags = 0x%x)", flags() & ~kHexRangePrintingFlag); |
273 } | 281 } |
274 | 282 |
275 } // namespace base | 283 } // namespace base |
OLD | NEW |