| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef BASE_METRICS_HISTOGRAM_SAMPLES_H_ |
| #define BASE_METRICS_HISTOGRAM_SAMPLES_H_ |
| |
| #include "base/basictypes.h" |
| #include "base/metrics/histogram_base.h" |
| #include "base/memory/scoped_ptr.h" |
| |
| namespace base { |
| |
| class Pickle; |
| class PickleIterator; |
| class SampleCountIterator; |
| |
| // HistogramSamples is a container storing all samples of a histogram. |
| class BASE_EXPORT HistogramSamples { |
| public: |
| HistogramSamples(); |
| virtual ~HistogramSamples(); |
| |
| virtual void Accumulate(HistogramBase::Sample value, |
| HistogramBase::Count count) = 0; |
| virtual HistogramBase::Count GetCount(HistogramBase::Sample value) const = 0; |
| virtual HistogramBase::Count TotalCount() const = 0; |
| |
| virtual void Add(const HistogramSamples& other); |
| |
| // Add from serialized samples. |
| virtual bool AddFromPickle(PickleIterator* iter); |
| |
| virtual void Subtract(const HistogramSamples& other); |
| |
| virtual scoped_ptr<SampleCountIterator> Iterator() const = 0; |
| virtual bool Serialize(Pickle* pickle) const; |
| |
| // Accessor fuctions. |
| int64 sum() const { return sum_; } |
| HistogramBase::Count redundant_count() const { |
| return subtle::NoBarrier_Load(&redundant_count_); |
| } |
| |
| protected: |
| // Based on |op| type, add or subtract sample counts data from the iterator. |
| enum Operator { ADD, SUBTRACT }; |
| virtual bool AddSubtractImpl(SampleCountIterator* iter, Operator op) = 0; |
| |
| void IncreaseSum(int64 diff); |
| void IncreaseRedundantCount(HistogramBase::Count diff); |
| |
| private: |
| int64 sum_; |
| |
| // |redundant_count_| helps identify memory corruption. It redundantly stores |
| // the total number of samples accumulated in the histogram. We can compare |
| // this count to the sum of the counts (TotalCount() function), and detect |
| // problems. Note, depending on the implementation of different histogram |
| // types, there might be races during histogram accumulation and snapshotting |
| // that we choose to accept. In this case, the tallies might mismatch even |
| // when no memory corruption has happened. |
| HistogramBase::AtomicCount redundant_count_; |
| }; |
| |
| class BASE_EXPORT SampleCountIterator { |
| public: |
| virtual ~SampleCountIterator(); |
| |
| virtual bool Done() const = 0; |
| virtual void Next() = 0; |
| |
| // Get the sample and count at current position. |
| // |min| |max| and |count| can be NULL if the value is not of interest. |
| // Requires: !Done(); |
| virtual void Get(HistogramBase::Sample* min, |
| HistogramBase::Sample* max, |
| HistogramBase::Count* count) const = 0; |
| |
| // Get the index of current histogram bucket. |
| // For histograms that don't use predefined buckets, it returns false. |
| // Requires: !Done(); |
| virtual bool GetBucketIndex(size_t* index) const; |
| }; |
| |
| } // namespace base |
| |
| #endif // BASE_METRICS_HISTOGRAM_SAMPLES_H_ |