88 lines
2.8 KiB
C
88 lines
2.8 KiB
C
|
// 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"
|
||
|
|
||
|
class Pickle;
|
||
|
class PickleIterator;
|
||
|
|
||
|
namespace base {
|
||
|
|
||
|
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 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::Count 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_
|