Index: base/metrics/histogram.h |
diff --git a/base/metrics/histogram.h b/base/metrics/histogram.h |
index 8840493af098437104ed0ba8693e72e860360ab9..608a30d96df05211fc1a237cc8b3dde0f045fa13 100644 |
--- a/base/metrics/histogram.h |
+++ b/base/metrics/histogram.h |
@@ -89,10 +89,13 @@ class BooleanHistogram; |
class CustomHistogram; |
class Histogram; |
class LinearHistogram; |
+class PersistentMemoryAllocator; |
class Pickle; |
class PickleIterator; |
class SampleVector; |
+struct PersistentHistogramData; |
+ |
class BASE_EXPORT Histogram : public HistogramBase { |
public: |
// Initialize maximum number of buckets in histograms as 16,384. |
@@ -190,6 +193,22 @@ class BASE_EXPORT Histogram : public HistogramBase { |
void WriteAscii(std::string* output) const override; |
protected: |
+ // This is the basis of all FactoryGet methods, parameterized with three |
+ // histogram-type-specific blocks of code to create the ranges, perform |
+ // allocation from the heap, and do any post-construction datafill. If |
+ // the min/max/count is not known in advance (i.e. it's determined |
+ // dynamically in |create_ranges|), pass zero (0) for all three. |
+ static HistogramBase* Histogram::FactoryGet( |
+ std::function<BucketRanges*()> create_ranges, |
+ std::function<HistogramBase*(const BucketRanges*)> heap_alloc, |
+ std::function<void(HistogramBase*)> fill_histogram, |
+ HistogramType histogram_type, |
+ const std::string& name, |
+ Sample minimum, |
+ Sample maximum, |
+ size_t bucket_count, |
+ int32 flags); |
+ |
// |ranges| should contain the underflow and overflow buckets. See top |
// comments for example. |
Histogram(const std::string& name, |
@@ -197,6 +216,20 @@ class BASE_EXPORT Histogram : public HistogramBase { |
Sample maximum, |
const BucketRanges* ranges); |
+ // Traditionally, histograms allocate their own memory for the bucket |
+ // vector but "shared" histograms use memory regions allocated from a |
+ // special memory segment that is passed in here. It is assumed that |
+ // the life of this memory is managed externally and exceeds the lifetime |
+ // of this object. Practically, this memory is never released until the |
+ // process exits and the OS cleans it up. |
+ Histogram(const std::string& name, |
+ Sample minimum, |
+ Sample maximum, |
+ const BucketRanges* ranges, |
+ HistogramBase::AtomicCount* counts, |
+ size_t counts_size, |
+ HistogramSamples::Metadata* meta); |
+ |
~Histogram() override; |
// HistogramBase implementation: |
@@ -225,6 +258,9 @@ class BASE_EXPORT Histogram : public HistogramBase { |
friend class StatisticsRecorder; // To allow it to delete duplicates. |
friend class StatisticsRecorderTest; |
+ friend BASE_EXPORT HistogramBase* CreatePersistentHistogram( |
+ PersistentMemoryAllocator* allocator, |
+ PersistentHistogramData* histogram_data); |
friend BASE_EXPORT HistogramBase* DeserializeHistogramInfo( |
base::PickleIterator* iter); |
static HistogramBase* DeserializeInfoImpl(base::PickleIterator* iter); |
@@ -339,6 +375,14 @@ class BASE_EXPORT LinearHistogram : public Histogram { |
Sample maximum, |
const BucketRanges* ranges); |
+ LinearHistogram(const std::string& name, |
+ Sample minimum, |
+ Sample maximum, |
+ const BucketRanges* ranges, |
+ HistogramBase::AtomicCount* counts, |
+ size_t counts_size, |
+ HistogramSamples::Metadata* meta); |
+ |
double GetBucketSize(Count current, size_t i) const override; |
// If we have a description for a bucket, then return that. Otherwise |
@@ -350,6 +394,9 @@ class BASE_EXPORT LinearHistogram : public Histogram { |
bool PrintEmptyBucket(size_t index) const override; |
private: |
+ friend BASE_EXPORT HistogramBase* CreatePersistentHistogram( |
+ PersistentMemoryAllocator* allocator, |
+ PersistentHistogramData* histogram_data); |
friend BASE_EXPORT HistogramBase* DeserializeHistogramInfo( |
base::PickleIterator* iter); |
static HistogramBase* DeserializeInfoImpl(base::PickleIterator* iter); |
@@ -379,7 +426,14 @@ class BASE_EXPORT BooleanHistogram : public LinearHistogram { |
private: |
BooleanHistogram(const std::string& name, const BucketRanges* ranges); |
- |
+ BooleanHistogram(const std::string& name, |
+ const BucketRanges* ranges, |
+ HistogramBase::AtomicCount* counts, |
+ HistogramSamples::Metadata* meta); |
+ |
+ friend BASE_EXPORT HistogramBase* CreatePersistentHistogram( |
+ PersistentMemoryAllocator* allocator, |
+ PersistentHistogramData* histogram_data); |
friend BASE_EXPORT HistogramBase* DeserializeHistogramInfo( |
base::PickleIterator* iter); |
static HistogramBase* DeserializeInfoImpl(base::PickleIterator* iter); |
@@ -422,19 +476,26 @@ class BASE_EXPORT CustomHistogram : public Histogram { |
CustomHistogram(const std::string& name, |
const BucketRanges* ranges); |
+ CustomHistogram(const std::string& name, |
+ const BucketRanges* ranges, |
+ HistogramBase::AtomicCount* counts, |
+ size_t counts_size, |
+ HistogramSamples::Metadata* meta); |
+ |
// HistogramBase implementation: |
bool SerializeInfoImpl(base::Pickle* pickle) const override; |
double GetBucketSize(Count current, size_t i) const override; |
private: |
+ friend BASE_EXPORT HistogramBase* CreatePersistentHistogram( |
+ PersistentMemoryAllocator* allocator, |
+ PersistentHistogramData* histogram_data); |
friend BASE_EXPORT HistogramBase* DeserializeHistogramInfo( |
base::PickleIterator* iter); |
static HistogramBase* DeserializeInfoImpl(base::PickleIterator* iter); |
static bool ValidateCustomRanges(const std::vector<Sample>& custom_ranges); |
- static BucketRanges* CreateBucketRangesFromCustomRanges( |
- const std::vector<Sample>& custom_ranges); |
DISALLOW_COPY_AND_ASSIGN(CustomHistogram); |
}; |