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/histogram_samples.h" | 5 #include "base/metrics/histogram_samples.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/numerics/safe_math.h" | 10 #include "base/numerics/safe_math.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 // handled in the code but it's worth making them as unlikely as possible. | 24 // handled in the code but it's worth making them as unlikely as possible. |
25 constexpr int32_t kDisabledSingleSample = -1; | 25 constexpr int32_t kDisabledSingleSample = -1; |
26 | 26 |
27 class SampleCountPickleIterator : public SampleCountIterator { | 27 class SampleCountPickleIterator : public SampleCountIterator { |
28 public: | 28 public: |
29 explicit SampleCountPickleIterator(PickleIterator* iter); | 29 explicit SampleCountPickleIterator(PickleIterator* iter); |
30 | 30 |
31 bool Done() const override; | 31 bool Done() const override; |
32 void Next() override; | 32 void Next() override; |
33 void Get(HistogramBase::Sample* min, | 33 void Get(HistogramBase::Sample* min, |
34 HistogramBase::Sample* max, | 34 int64_t* max, |
35 HistogramBase::Count* count) const override; | 35 HistogramBase::Count* count) const override; |
36 | 36 |
37 private: | 37 private: |
38 PickleIterator* const iter_; | 38 PickleIterator* const iter_; |
39 | 39 |
40 HistogramBase::Sample min_; | 40 HistogramBase::Sample min_; |
41 HistogramBase::Sample max_; | 41 int64_t max_; |
42 HistogramBase::Count count_; | 42 HistogramBase::Count count_; |
43 bool is_done_; | 43 bool is_done_; |
44 }; | 44 }; |
45 | 45 |
46 SampleCountPickleIterator::SampleCountPickleIterator(PickleIterator* iter) | 46 SampleCountPickleIterator::SampleCountPickleIterator(PickleIterator* iter) |
47 : iter_(iter), | 47 : iter_(iter), |
48 is_done_(false) { | 48 is_done_(false) { |
49 Next(); | 49 Next(); |
50 } | 50 } |
51 | 51 |
52 bool SampleCountPickleIterator::Done() const { | 52 bool SampleCountPickleIterator::Done() const { |
53 return is_done_; | 53 return is_done_; |
54 } | 54 } |
55 | 55 |
56 void SampleCountPickleIterator::Next() { | 56 void SampleCountPickleIterator::Next() { |
57 DCHECK(!Done()); | 57 DCHECK(!Done()); |
58 if (!iter_->ReadInt(&min_) || | 58 if (!iter_->ReadInt(&min_) || !iter_->ReadInt64(&max_) || |
59 !iter_->ReadInt(&max_) || | 59 !iter_->ReadInt(&count_)) { |
60 !iter_->ReadInt(&count_)) | |
61 is_done_ = true; | 60 is_done_ = true; |
| 61 } |
62 } | 62 } |
63 | 63 |
64 void SampleCountPickleIterator::Get(HistogramBase::Sample* min, | 64 void SampleCountPickleIterator::Get(HistogramBase::Sample* min, |
65 HistogramBase::Sample* max, | 65 int64_t* max, |
66 HistogramBase::Count* count) const { | 66 HistogramBase::Count* count) const { |
67 DCHECK(!Done()); | 67 DCHECK(!Done()); |
68 *min = min_; | 68 *min = min_; |
69 *max = max_; | 69 *max = max_; |
70 *count = count_; | 70 *count = count_; |
71 } | 71 } |
72 | 72 |
73 } // namespace | 73 } // namespace |
74 | 74 |
75 static_assert(sizeof(HistogramSamples::AtomicSingleSample) == | 75 static_assert(sizeof(HistogramSamples::AtomicSingleSample) == |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 DCHECK(success); | 213 DCHECK(success); |
214 } | 214 } |
215 | 215 |
216 bool HistogramSamples::Serialize(Pickle* pickle) const { | 216 bool HistogramSamples::Serialize(Pickle* pickle) const { |
217 if (!pickle->WriteInt64(sum())) | 217 if (!pickle->WriteInt64(sum())) |
218 return false; | 218 return false; |
219 if (!pickle->WriteInt(redundant_count())) | 219 if (!pickle->WriteInt(redundant_count())) |
220 return false; | 220 return false; |
221 | 221 |
222 HistogramBase::Sample min; | 222 HistogramBase::Sample min; |
223 HistogramBase::Sample max; | 223 int64_t max; |
224 HistogramBase::Count count; | 224 HistogramBase::Count count; |
225 for (std::unique_ptr<SampleCountIterator> it = Iterator(); !it->Done(); | 225 for (std::unique_ptr<SampleCountIterator> it = Iterator(); !it->Done(); |
226 it->Next()) { | 226 it->Next()) { |
227 it->Get(&min, &max, &count); | 227 it->Get(&min, &max, &count); |
228 if (!pickle->WriteInt(min) || | 228 if (!pickle->WriteInt(min) || !pickle->WriteInt64(max) || |
229 !pickle->WriteInt(max) || | 229 !pickle->WriteInt(count)) { |
230 !pickle->WriteInt(count)) | |
231 return false; | 230 return false; |
| 231 } |
232 } | 232 } |
233 return true; | 233 return true; |
234 } | 234 } |
235 | 235 |
236 bool HistogramSamples::AccumulateSingleSample(HistogramBase::Sample value, | 236 bool HistogramSamples::AccumulateSingleSample(HistogramBase::Sample value, |
237 HistogramBase::Count count, | 237 HistogramBase::Count count, |
238 size_t bucket) { | 238 size_t bucket) { |
239 if (single_sample().Accumulate(bucket, count)) { | 239 if (single_sample().Accumulate(bucket, count)) { |
240 // Success. Update the (separate) sum and redundant-count. | 240 // Success. Update the (separate) sum and redundant-count. |
241 IncreaseSumAndCount(static_cast<int64_t>(value) * count, count); | 241 IncreaseSumAndCount(static_cast<int64_t>(value) * count, count); |
(...skipping 13 matching lines...) Expand all Loading... |
255 } | 255 } |
256 | 256 |
257 SampleCountIterator::~SampleCountIterator() {} | 257 SampleCountIterator::~SampleCountIterator() {} |
258 | 258 |
259 bool SampleCountIterator::GetBucketIndex(size_t* index) const { | 259 bool SampleCountIterator::GetBucketIndex(size_t* index) const { |
260 DCHECK(!Done()); | 260 DCHECK(!Done()); |
261 return false; | 261 return false; |
262 } | 262 } |
263 | 263 |
264 SingleSampleIterator::SingleSampleIterator(HistogramBase::Sample min, | 264 SingleSampleIterator::SingleSampleIterator(HistogramBase::Sample min, |
265 HistogramBase::Sample max, | 265 int64_t max, |
266 HistogramBase::Count count) | 266 HistogramBase::Count count) |
267 : SingleSampleIterator(min, max, count, kSizeMax) {} | 267 : SingleSampleIterator(min, max, count, kSizeMax) {} |
268 | 268 |
269 SingleSampleIterator::SingleSampleIterator(HistogramBase::Sample min, | 269 SingleSampleIterator::SingleSampleIterator(HistogramBase::Sample min, |
270 HistogramBase::Sample max, | 270 int64_t max, |
271 HistogramBase::Count count, | 271 HistogramBase::Count count, |
272 size_t bucket_index) | 272 size_t bucket_index) |
273 : min_(min), max_(max), bucket_index_(bucket_index), count_(count) {} | 273 : min_(min), max_(max), bucket_index_(bucket_index), count_(count) {} |
274 | 274 |
275 SingleSampleIterator::~SingleSampleIterator() {} | 275 SingleSampleIterator::~SingleSampleIterator() {} |
276 | 276 |
277 bool SingleSampleIterator::Done() const { | 277 bool SingleSampleIterator::Done() const { |
278 return count_ == 0; | 278 return count_ == 0; |
279 } | 279 } |
280 | 280 |
281 void SingleSampleIterator::Next() { | 281 void SingleSampleIterator::Next() { |
282 DCHECK(!Done()); | 282 DCHECK(!Done()); |
283 count_ = 0; | 283 count_ = 0; |
284 } | 284 } |
285 | 285 |
286 void SingleSampleIterator::Get(HistogramBase::Sample* min, | 286 void SingleSampleIterator::Get(HistogramBase::Sample* min, |
287 HistogramBase::Sample* max, | 287 int64_t* max, |
288 HistogramBase::Count* count) const { | 288 HistogramBase::Count* count) const { |
289 DCHECK(!Done()); | 289 DCHECK(!Done()); |
290 if (min != nullptr) | 290 if (min != nullptr) |
291 *min = min_; | 291 *min = min_; |
292 if (max != nullptr) | 292 if (max != nullptr) |
293 *max = max_; | 293 *max = max_; |
294 if (count != nullptr) | 294 if (count != nullptr) |
295 *count = count_; | 295 *count = count_; |
296 } | 296 } |
297 | 297 |
298 bool SingleSampleIterator::GetBucketIndex(size_t* index) const { | 298 bool SingleSampleIterator::GetBucketIndex(size_t* index) const { |
299 DCHECK(!Done()); | 299 DCHECK(!Done()); |
300 if (bucket_index_ == kSizeMax) | 300 if (bucket_index_ == kSizeMax) |
301 return false; | 301 return false; |
302 *index = bucket_index_; | 302 *index = bucket_index_; |
303 return true; | 303 return true; |
304 } | 304 } |
305 | 305 |
306 } // namespace base | 306 } // namespace base |
OLD | NEW |