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)#ifndef BASE_METRICS_HISTOGRAM_SAMPLES_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_METRICS_HISTOGRAM_SAMPLES_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram_base.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Pickle; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PickleIterator; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SampleCountIterator; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HistogramSamples is a container storing all samples of a histogram. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT HistogramSamples { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistogramSamples(); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~HistogramSamples(); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Accumulate(HistogramBase::Sample value, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistogramBase::Count count) = 0; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual HistogramBase::Count GetCount(HistogramBase::Sample value) const = 0; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual HistogramBase::Count TotalCount() const = 0; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Add(const HistogramSamples& other); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add from serialized samples. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool AddFromPickle(PickleIterator* iter); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Subtract(const HistogramSamples& other); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual scoped_ptr<SampleCountIterator> Iterator() const = 0; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Serialize(Pickle* pickle) const; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accessor fuctions. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 sum() const { return sum_; } 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HistogramBase::Count redundant_count() const { 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return subtle::NoBarrier_Load(&redundant_count_); 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Based on |op| type, add or subtract sample counts data from the iterator. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Operator { ADD, SUBTRACT }; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool AddSubtractImpl(SampleCountIterator* iter, Operator op) = 0; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void IncreaseSum(int64 diff); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void IncreaseRedundantCount(HistogramBase::Count diff); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 sum_; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |redundant_count_| helps identify memory corruption. It redundantly stores 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the total number of samples accumulated in the histogram. We can compare 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this count to the sum of the counts (TotalCount() function), and detect 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // problems. Note, depending on the implementation of different histogram 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // types, there might be races during histogram accumulation and snapshotting 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that we choose to accept. In this case, the tallies might mismatch even 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when no memory corruption has happened. 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HistogramBase::AtomicCount redundant_count_; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT SampleCountIterator { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SampleCountIterator(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Done() const = 0; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Next() = 0; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the sample and count at current position. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |min| |max| and |count| can be NULL if the value is not of interest. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requires: !Done(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Get(HistogramBase::Sample* min, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistogramBase::Sample* max, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistogramBase::Count* count) const = 0; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the index of current histogram bucket. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For histograms that don't use predefined buckets, it returns false. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requires: !Done(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetBucketIndex(size_t* index) const; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // BASE_METRICS_HISTOGRAM_SAMPLES_H_ 90