15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BucketRanges stores the vector of ranges that delimit what samples are 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tallied in the corresponding buckets of a histogram. Histograms that have 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// same ranges for all their corresponding buckets should share the same 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BucketRanges object. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// E.g. A 5 buckets LinearHistogram with 1 as minimal value and 4 as maximal 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// value will need a BucketRanges with 6 ranges: 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 0, 1, 2, 3, 4, INT_MAX 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(kaiwang): Currently we keep all negative values in 0~1 bucket. Consider 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// changing 0 to INT_MIN. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_METRICS_BUCKET_RANGES_H_ 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_METRICS_BUCKET_RANGES_H_ 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_export.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram_base.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT BucketRanges { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<HistogramBase::Sample> Ranges; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit BucketRanges(size_t num_ranges); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~BucketRanges(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size() const { return ranges_.size(); } 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistogramBase::Sample range(size_t i) const { return ranges_[i]; } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_range(size_t i, HistogramBase::Sample value); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 checksum() const { return checksum_; } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_checksum(uint32 checksum) { checksum_ = checksum; } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // A bucket is defined by a consecutive pair of entries in |ranges|, so there 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // is one fewer bucket than there are ranges. For example, if |ranges| is 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // [0, 1, 3, 7, INT_MAX], then the buckets in this histogram are 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // [0, 1), [1, 3), [3, 7), and [7, INT_MAX). 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t bucket_count() const { return ranges_.size() - 1; } 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checksum methods to verify whether the ranges are corrupted (e.g. bad 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // memory access). 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 CalculateChecksum() const; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasValidChecksum() const; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ResetChecksum(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return true iff |other| object has same ranges_ as |this| object's ranges_. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Equals(const BucketRanges* other) const; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A monotonically increasing list of values which determine which bucket to 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // put a sample into. For each index, show the smallest sample that can be 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // added to the corresponding bucket. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Ranges ranges_; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checksum for the conntents of ranges_. Used to detect random over-writes 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of our data, and to quickly see if some other BucketRanges instance is 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // possibly Equal() to this instance. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kaiwang): Consider change this to uint64. Because we see a lot of 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // noise on UMA dashboard. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 checksum_; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BucketRanges); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////// 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Expose only for test. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BASE_EXPORT_PRIVATE extern const uint32 kCrcTable[256]; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // BASE_METRICS_BUCKET_RANGES_H_ 80