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 // Histogram is an object that aggregates statistics, and can summarize them in | 5 // Histogram is an object that aggregates statistics, and can summarize them in |
6 // various forms, including ASCII graphical, HTML, and numerically (as a | 6 // various forms, including ASCII graphical, HTML, and numerically (as a |
7 // vector of numbers corresponding to each of the aggregating buckets). | 7 // vector of numbers corresponding to each of the aggregating buckets). |
8 // See header file for details and examples. | 8 // See header file for details and examples. |
9 | 9 |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 19 matching lines...) Expand all Loading... |
30 | 30 |
31 namespace base { | 31 namespace base { |
32 | 32 |
33 namespace { | 33 namespace { |
34 | 34 |
35 bool ReadHistogramArguments(PickleIterator* iter, | 35 bool ReadHistogramArguments(PickleIterator* iter, |
36 string* histogram_name, | 36 string* histogram_name, |
37 int* flags, | 37 int* flags, |
38 int* declared_min, | 38 int* declared_min, |
39 int* declared_max, | 39 int* declared_max, |
40 uint64* bucket_count, | 40 size_t* bucket_count, |
41 uint32* range_checksum) { | 41 uint32* range_checksum) { |
42 if (!iter->ReadString(histogram_name) || | 42 if (!iter->ReadString(histogram_name) || |
43 !iter->ReadInt(flags) || | 43 !iter->ReadInt(flags) || |
44 !iter->ReadInt(declared_min) || | 44 !iter->ReadInt(declared_min) || |
45 !iter->ReadInt(declared_max) || | 45 !iter->ReadInt(declared_max) || |
46 !iter->ReadUInt64(bucket_count) || | 46 !iter->ReadSizeT(bucket_count) || |
47 !iter->ReadUInt32(range_checksum)) { | 47 !iter->ReadUInt32(range_checksum)) { |
48 DLOG(ERROR) << "Pickle error decoding Histogram: " << *histogram_name; | 48 DLOG(ERROR) << "Pickle error decoding Histogram: " << *histogram_name; |
49 return false; | 49 return false; |
50 } | 50 } |
51 | 51 |
52 // Since these fields may have come from an untrusted renderer, do additional | 52 // Since these fields may have come from an untrusted renderer, do additional |
53 // checks above and beyond those in Histogram::Initialize() | 53 // checks above and beyond those in Histogram::Initialize() |
54 if (*declared_max <= 0 || | 54 if (*declared_max <= 0 || |
55 *declared_min <= 0 || | 55 *declared_min <= 0 || |
56 *declared_max < *declared_min || | 56 *declared_max < *declared_min || |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
289 void Histogram::WriteAscii(string* output) const { | 289 void Histogram::WriteAscii(string* output) const { |
290 WriteAsciiImpl(true, "\n", output); | 290 WriteAsciiImpl(true, "\n", output); |
291 } | 291 } |
292 | 292 |
293 bool Histogram::SerializeInfoImpl(Pickle* pickle) const { | 293 bool Histogram::SerializeInfoImpl(Pickle* pickle) const { |
294 DCHECK(bucket_ranges()->HasValidChecksum()); | 294 DCHECK(bucket_ranges()->HasValidChecksum()); |
295 return pickle->WriteString(histogram_name()) && | 295 return pickle->WriteString(histogram_name()) && |
296 pickle->WriteInt(flags()) && | 296 pickle->WriteInt(flags()) && |
297 pickle->WriteInt(declared_min()) && | 297 pickle->WriteInt(declared_min()) && |
298 pickle->WriteInt(declared_max()) && | 298 pickle->WriteInt(declared_max()) && |
299 pickle->WriteUInt64(bucket_count()) && | 299 pickle->WriteSizeT(bucket_count()) && |
300 pickle->WriteUInt32(bucket_ranges()->checksum()); | 300 pickle->WriteUInt32(bucket_ranges()->checksum()); |
301 } | 301 } |
302 | 302 |
303 Histogram::Histogram(const string& name, | 303 Histogram::Histogram(const string& name, |
304 Sample minimum, | 304 Sample minimum, |
305 Sample maximum, | 305 Sample maximum, |
306 const BucketRanges* ranges) | 306 const BucketRanges* ranges) |
307 : HistogramBase(name), | 307 : HistogramBase(name), |
308 bucket_ranges_(ranges), | 308 bucket_ranges_(ranges), |
309 declared_min_(minimum), | 309 declared_min_(minimum), |
(...skipping 29 matching lines...) Expand all Loading... |
339 | 339 |
340 //------------------------------------------------------------------------------ | 340 //------------------------------------------------------------------------------ |
341 // Private methods | 341 // Private methods |
342 | 342 |
343 // static | 343 // static |
344 HistogramBase* Histogram::DeserializeInfoImpl(PickleIterator* iter) { | 344 HistogramBase* Histogram::DeserializeInfoImpl(PickleIterator* iter) { |
345 string histogram_name; | 345 string histogram_name; |
346 int flags; | 346 int flags; |
347 int declared_min; | 347 int declared_min; |
348 int declared_max; | 348 int declared_max; |
349 uint64 bucket_count; | 349 size_t bucket_count; |
350 uint32 range_checksum; | 350 uint32 range_checksum; |
351 | 351 |
352 if (!ReadHistogramArguments(iter, &histogram_name, &flags, &declared_min, | 352 if (!ReadHistogramArguments(iter, &histogram_name, &flags, &declared_min, |
353 &declared_max, &bucket_count, &range_checksum)) { | 353 &declared_max, &bucket_count, &range_checksum)) { |
354 return NULL; | 354 return NULL; |
355 } | 355 } |
356 | 356 |
357 // Find or create the local version of the histogram in this process. | 357 // Find or create the local version of the histogram in this process. |
358 HistogramBase* histogram = Histogram::FactoryGet( | 358 HistogramBase* histogram = Histogram::FactoryGet( |
359 histogram_name, declared_min, declared_max, bucket_count, flags); | 359 histogram_name, declared_min, declared_max, bucket_count, flags); |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
627 ranges->set_range(ranges->bucket_count(), HistogramBase::kSampleType_MAX); | 627 ranges->set_range(ranges->bucket_count(), HistogramBase::kSampleType_MAX); |
628 ranges->ResetChecksum(); | 628 ranges->ResetChecksum(); |
629 } | 629 } |
630 | 630 |
631 // static | 631 // static |
632 HistogramBase* LinearHistogram::DeserializeInfoImpl(PickleIterator* iter) { | 632 HistogramBase* LinearHistogram::DeserializeInfoImpl(PickleIterator* iter) { |
633 string histogram_name; | 633 string histogram_name; |
634 int flags; | 634 int flags; |
635 int declared_min; | 635 int declared_min; |
636 int declared_max; | 636 int declared_max; |
637 uint64 bucket_count; | 637 size_t bucket_count; |
638 uint32 range_checksum; | 638 uint32 range_checksum; |
639 | 639 |
640 if (!ReadHistogramArguments(iter, &histogram_name, &flags, &declared_min, | 640 if (!ReadHistogramArguments(iter, &histogram_name, &flags, &declared_min, |
641 &declared_max, &bucket_count, &range_checksum)) { | 641 &declared_max, &bucket_count, &range_checksum)) { |
642 return NULL; | 642 return NULL; |
643 } | 643 } |
644 | 644 |
645 HistogramBase* histogram = LinearHistogram::FactoryGet( | 645 HistogramBase* histogram = LinearHistogram::FactoryGet( |
646 histogram_name, declared_min, declared_max, bucket_count, flags); | 646 histogram_name, declared_min, declared_max, bucket_count, flags); |
647 if (!ValidateRangeChecksum(*histogram, range_checksum)) { | 647 if (!ValidateRangeChecksum(*histogram, range_checksum)) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
682 | 682 |
683 BooleanHistogram::BooleanHistogram(const string& name, | 683 BooleanHistogram::BooleanHistogram(const string& name, |
684 const BucketRanges* ranges) | 684 const BucketRanges* ranges) |
685 : LinearHistogram(name, 1, 2, ranges) {} | 685 : LinearHistogram(name, 1, 2, ranges) {} |
686 | 686 |
687 HistogramBase* BooleanHistogram::DeserializeInfoImpl(PickleIterator* iter) { | 687 HistogramBase* BooleanHistogram::DeserializeInfoImpl(PickleIterator* iter) { |
688 string histogram_name; | 688 string histogram_name; |
689 int flags; | 689 int flags; |
690 int declared_min; | 690 int declared_min; |
691 int declared_max; | 691 int declared_max; |
692 uint64 bucket_count; | 692 size_t bucket_count; |
693 uint32 range_checksum; | 693 uint32 range_checksum; |
694 | 694 |
695 if (!ReadHistogramArguments(iter, &histogram_name, &flags, &declared_min, | 695 if (!ReadHistogramArguments(iter, &histogram_name, &flags, &declared_min, |
696 &declared_max, &bucket_count, &range_checksum)) { | 696 &declared_max, &bucket_count, &range_checksum)) { |
697 return NULL; | 697 return NULL; |
698 } | 698 } |
699 | 699 |
700 HistogramBase* histogram = BooleanHistogram::FactoryGet( | 700 HistogramBase* histogram = BooleanHistogram::FactoryGet( |
701 histogram_name, flags); | 701 histogram_name, flags); |
702 if (!ValidateRangeChecksum(*histogram, range_checksum)) { | 702 if (!ValidateRangeChecksum(*histogram, range_checksum)) { |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
777 double CustomHistogram::GetBucketSize(Count current, size_t i) const { | 777 double CustomHistogram::GetBucketSize(Count current, size_t i) const { |
778 return 1; | 778 return 1; |
779 } | 779 } |
780 | 780 |
781 // static | 781 // static |
782 HistogramBase* CustomHistogram::DeserializeInfoImpl(PickleIterator* iter) { | 782 HistogramBase* CustomHistogram::DeserializeInfoImpl(PickleIterator* iter) { |
783 string histogram_name; | 783 string histogram_name; |
784 int flags; | 784 int flags; |
785 int declared_min; | 785 int declared_min; |
786 int declared_max; | 786 int declared_max; |
787 uint64 bucket_count; | 787 size_t bucket_count; |
788 uint32 range_checksum; | 788 uint32 range_checksum; |
789 | 789 |
790 if (!ReadHistogramArguments(iter, &histogram_name, &flags, &declared_min, | 790 if (!ReadHistogramArguments(iter, &histogram_name, &flags, &declared_min, |
791 &declared_max, &bucket_count, &range_checksum)) { | 791 &declared_max, &bucket_count, &range_checksum)) { |
792 return NULL; | 792 return NULL; |
793 } | 793 } |
794 | 794 |
795 // First and last ranges are not serialized. | 795 // First and last ranges are not serialized. |
796 vector<Sample> sample_ranges(bucket_count - 1); | 796 vector<Sample> sample_ranges(bucket_count - 1); |
797 | 797 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
835 | 835 |
836 BucketRanges* bucket_ranges = new BucketRanges(ranges.size()); | 836 BucketRanges* bucket_ranges = new BucketRanges(ranges.size()); |
837 for (size_t i = 0; i < ranges.size(); i++) { | 837 for (size_t i = 0; i < ranges.size(); i++) { |
838 bucket_ranges->set_range(i, ranges[i]); | 838 bucket_ranges->set_range(i, ranges[i]); |
839 } | 839 } |
840 bucket_ranges->ResetChecksum(); | 840 bucket_ranges->ResetChecksum(); |
841 return bucket_ranges; | 841 return bucket_ranges; |
842 } | 842 } |
843 | 843 |
844 } // namespace base | 844 } // namespace base |
OLD | NEW |