| Index: base/metrics/histogram_samples.h
|
| diff --git a/base/metrics/histogram_samples.h b/base/metrics/histogram_samples.h
|
| index 54185cf383ba02d25e5e586b2d69a9f822275db2..98e372bebfe61af9d1e46a5249f31bc521a7f2bc 100644
|
| --- a/base/metrics/histogram_samples.h
|
| +++ b/base/metrics/histogram_samples.h
|
| @@ -5,6 +5,7 @@
|
| #ifndef BASE_METRICS_HISTOGRAM_SAMPLES_H_
|
| #define BASE_METRICS_HISTOGRAM_SAMPLES_H_
|
|
|
| +#include "base/atomicops.h"
|
| #include "base/basictypes.h"
|
| #include "base/metrics/histogram_base.h"
|
| #include "base/memory/scoped_ptr.h"
|
| @@ -18,7 +19,35 @@ class SampleCountIterator;
|
| // HistogramSamples is a container storing all samples of a histogram.
|
| class BASE_EXPORT HistogramSamples {
|
| public:
|
| - HistogramSamples();
|
| + struct Metadata {
|
| + // Initialized when the sample-set is first created with a value provided
|
| + // by the caller. It is generally used to identify the sample-set across
|
| + // threads and processes, though not necessarily uniquely as it is possible
|
| + // to have multiple sample-sets representing subsets of the data.
|
| + uint64_t id;
|
| +
|
| + // The sum of all the entries, effectivly the sum(sample * count) for
|
| + // all samples. Despite being atomic, no guarantees are made on the
|
| + // accuracy of this value; there may be races during histogram
|
| + // accumulation and snapshotting that we choose to accept. It should
|
| + // be treated as approximate.
|
| + // TODO(bcwhite): Change this to std::atomic<int64_t>.
|
| + int64_t sum;
|
| +
|
| + // A "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;
|
| +
|
| + Metadata() : id(0), sum(0), redundant_count(0) {}
|
| + };
|
| +
|
| + explicit HistogramSamples(uint64_t id);
|
| + HistogramSamples(uint64_t id, Metadata* meta);
|
| virtual ~HistogramSamples();
|
|
|
| virtual void Accumulate(HistogramBase::Sample value,
|
| @@ -37,9 +66,10 @@ class BASE_EXPORT HistogramSamples {
|
| virtual bool Serialize(Pickle* pickle) const;
|
|
|
| // Accessor fuctions.
|
| - int64 sum() const { return sum_; }
|
| + uint64_t id() const { return meta_->id; }
|
| + int64_t sum() const { return meta_->sum; }
|
| HistogramBase::Count redundant_count() const {
|
| - return subtle::NoBarrier_Load(&redundant_count_);
|
| + return subtle::NoBarrier_Load(&meta_->redundant_count);
|
| }
|
|
|
| protected:
|
| @@ -47,20 +77,17 @@ class BASE_EXPORT HistogramSamples {
|
| enum Operator { ADD, SUBTRACT };
|
| virtual bool AddSubtractImpl(SampleCountIterator* iter, Operator op) = 0;
|
|
|
| - void IncreaseSum(int64 diff);
|
| + void IncreaseSum(int64_t 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_;
|
| + // In order to support histograms shared through an external memory segment,
|
| + // meta values may be the local storage or external storage depending on the
|
| + // wishes of the derived class.
|
| + Metadata local_meta_;
|
| + Metadata* meta_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(HistogramSamples);
|
| };
|
|
|
| class BASE_EXPORT SampleCountIterator {
|
|
|