|  | // 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_SPARSE_HISTOGRAM_H_ | 
|  | #define BASE_METRICS_SPARSE_HISTOGRAM_H_ | 
|  |  | 
|  | #include <stddef.h> | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include <map> | 
|  | #include <memory> | 
|  | #include <string> | 
|  |  | 
|  | #include "base/base_export.h" | 
|  | #include "base/macros.h" | 
|  | #include "base/metrics/histogram_base.h" | 
|  | #include "base/metrics/histogram_samples.h" | 
|  | #include "base/synchronization/lock.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | class HistogramSamples; | 
|  | class PersistentHistogramAllocator; | 
|  | class Pickle; | 
|  | class PickleIterator; | 
|  |  | 
|  | class BASE_EXPORT SparseHistogram : public HistogramBase { | 
|  | public: | 
|  | // If there's one with same name, return the existing one. If not, create a | 
|  | // new one. | 
|  | static HistogramBase* FactoryGet(const std::string& name, int32_t flags); | 
|  |  | 
|  | // Create a histogram using data in persistent storage. The allocator must | 
|  | // live longer than the created sparse histogram. | 
|  | static std::unique_ptr<HistogramBase> PersistentCreate( | 
|  | PersistentHistogramAllocator* allocator, | 
|  | const char* name, | 
|  | HistogramSamples::Metadata* meta, | 
|  | HistogramSamples::Metadata* logged_meta); | 
|  |  | 
|  | ~SparseHistogram() override; | 
|  |  | 
|  | // HistogramBase implementation: | 
|  | uint64_t name_hash() const override; | 
|  | HistogramType GetHistogramType() const override; | 
|  | bool HasConstructionArguments(Sample expected_minimum, | 
|  | Sample expected_maximum, | 
|  | uint32_t expected_bucket_count) const override; | 
|  | void Add(Sample value) override; | 
|  | void AddCount(Sample value, int count) override; | 
|  | void AddSamples(const HistogramSamples& samples) override; | 
|  | bool AddSamplesFromPickle(base::PickleIterator* iter) override; | 
|  | std::unique_ptr<HistogramSamples> SnapshotSamples() const override; | 
|  | std::unique_ptr<HistogramSamples> SnapshotDelta() override; | 
|  | std::unique_ptr<HistogramSamples> SnapshotFinalDelta() const override; | 
|  | void WriteHTMLGraph(std::string* output) const override; | 
|  | void WriteAscii(std::string* output) const override; | 
|  |  | 
|  | protected: | 
|  | // HistogramBase implementation: | 
|  | void SerializeInfoImpl(base::Pickle* pickle) const override; | 
|  |  | 
|  | private: | 
|  | // Clients should always use FactoryGet to create SparseHistogram. | 
|  | explicit SparseHistogram(const char* name); | 
|  |  | 
|  | SparseHistogram(PersistentHistogramAllocator* allocator, | 
|  | const char* name, | 
|  | HistogramSamples::Metadata* meta, | 
|  | HistogramSamples::Metadata* logged_meta); | 
|  |  | 
|  | friend BASE_EXPORT HistogramBase* DeserializeHistogramInfo( | 
|  | base::PickleIterator* iter); | 
|  | static HistogramBase* DeserializeInfoImpl(base::PickleIterator* iter); | 
|  |  | 
|  | void GetParameters(DictionaryValue* params) const override; | 
|  | void GetCountAndBucketData(Count* count, | 
|  | int64_t* sum, | 
|  | ListValue* buckets) const override; | 
|  |  | 
|  | // Helpers for emitting Ascii graphic.  Each method appends data to output. | 
|  | void WriteAsciiImpl(bool graph_it, | 
|  | const std::string& newline, | 
|  | std::string* output) const; | 
|  |  | 
|  | // Write a common header message describing this histogram. | 
|  | void WriteAsciiHeader(const Count total_count, | 
|  | std::string* output) const; | 
|  |  | 
|  | // For constuctor calling. | 
|  | friend class SparseHistogramTest; | 
|  |  | 
|  | // Protects access to |samples_|. | 
|  | mutable base::Lock lock_; | 
|  |  | 
|  | // Flag to indicate if PrepareFinalDelta has been previously called. | 
|  | mutable bool final_delta_created_ = false; | 
|  |  | 
|  | std::unique_ptr<HistogramSamples> unlogged_samples_; | 
|  | std::unique_ptr<HistogramSamples> logged_samples_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(SparseHistogram); | 
|  | }; | 
|  |  | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_METRICS_SPARSE_HISTOGRAM_H_ |