1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_METRICS_SPARSE_HISTOGRAM_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_METRICS_SPARSE_HISTOGRAM_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stddef.h> 9*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include <map> 12*6777b538SAndroid Build Coastguard Worker #include <memory> 13*6777b538SAndroid Build Coastguard Worker #include <string> 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 16*6777b538SAndroid Build Coastguard Worker #include "base/metrics/histogram_base.h" 17*6777b538SAndroid Build Coastguard Worker #include "base/metrics/histogram_samples.h" 18*6777b538SAndroid Build Coastguard Worker #include "base/synchronization/lock.h" 19*6777b538SAndroid Build Coastguard Worker #include "base/values.h" 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker namespace base { 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker class HistogramSamples; 24*6777b538SAndroid Build Coastguard Worker class PersistentHistogramAllocator; 25*6777b538SAndroid Build Coastguard Worker class Pickle; 26*6777b538SAndroid Build Coastguard Worker class PickleIterator; 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT SparseHistogram : public HistogramBase { 29*6777b538SAndroid Build Coastguard Worker public: 30*6777b538SAndroid Build Coastguard Worker // If there's one with same name, return the existing one. If not, create a 31*6777b538SAndroid Build Coastguard Worker // new one. 32*6777b538SAndroid Build Coastguard Worker static HistogramBase* FactoryGet(const std::string& name, int32_t flags); 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker // Create a histogram using data in persistent storage. The allocator must 35*6777b538SAndroid Build Coastguard Worker // live longer than the created sparse histogram. 36*6777b538SAndroid Build Coastguard Worker static std::unique_ptr<HistogramBase> PersistentCreate( 37*6777b538SAndroid Build Coastguard Worker PersistentHistogramAllocator* allocator, 38*6777b538SAndroid Build Coastguard Worker const char* name, 39*6777b538SAndroid Build Coastguard Worker HistogramSamples::Metadata* meta, 40*6777b538SAndroid Build Coastguard Worker HistogramSamples::Metadata* logged_meta); 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker SparseHistogram(const SparseHistogram&) = delete; 43*6777b538SAndroid Build Coastguard Worker SparseHistogram& operator=(const SparseHistogram&) = delete; 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker ~SparseHistogram() override; 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Worker // HistogramBase implementation: 48*6777b538SAndroid Build Coastguard Worker uint64_t name_hash() const override; 49*6777b538SAndroid Build Coastguard Worker HistogramType GetHistogramType() const override; 50*6777b538SAndroid Build Coastguard Worker bool HasConstructionArguments(Sample expected_minimum, 51*6777b538SAndroid Build Coastguard Worker Sample expected_maximum, 52*6777b538SAndroid Build Coastguard Worker size_t expected_bucket_count) const override; 53*6777b538SAndroid Build Coastguard Worker void Add(Sample value) override; 54*6777b538SAndroid Build Coastguard Worker void AddCount(Sample value, int count) override; 55*6777b538SAndroid Build Coastguard Worker void AddSamples(const HistogramSamples& samples) override; 56*6777b538SAndroid Build Coastguard Worker bool AddSamplesFromPickle(base::PickleIterator* iter) override; 57*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HistogramSamples> SnapshotSamples() const override; 58*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HistogramSamples> SnapshotUnloggedSamples() const override; 59*6777b538SAndroid Build Coastguard Worker void MarkSamplesAsLogged(const HistogramSamples& samples) override; 60*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HistogramSamples> SnapshotDelta() override; 61*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HistogramSamples> SnapshotFinalDelta() const override; 62*6777b538SAndroid Build Coastguard Worker base::Value::Dict ToGraphDict() const override; 63*6777b538SAndroid Build Coastguard Worker 64*6777b538SAndroid Build Coastguard Worker protected: 65*6777b538SAndroid Build Coastguard Worker // HistogramBase implementation: 66*6777b538SAndroid Build Coastguard Worker void SerializeInfoImpl(base::Pickle* pickle) const override; 67*6777b538SAndroid Build Coastguard Worker 68*6777b538SAndroid Build Coastguard Worker private: 69*6777b538SAndroid Build Coastguard Worker // Clients should always use FactoryGet to create SparseHistogram. 70*6777b538SAndroid Build Coastguard Worker explicit SparseHistogram(const char* name); 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Worker SparseHistogram(PersistentHistogramAllocator* allocator, 73*6777b538SAndroid Build Coastguard Worker const char* name, 74*6777b538SAndroid Build Coastguard Worker HistogramSamples::Metadata* meta, 75*6777b538SAndroid Build Coastguard Worker HistogramSamples::Metadata* logged_meta); 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker friend BASE_EXPORT HistogramBase* DeserializeHistogramInfo( 78*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter); 79*6777b538SAndroid Build Coastguard Worker static HistogramBase* DeserializeInfoImpl(base::PickleIterator* iter); 80*6777b538SAndroid Build Coastguard Worker 81*6777b538SAndroid Build Coastguard Worker // Writes the type of the sparse histogram in the |params|. 82*6777b538SAndroid Build Coastguard Worker Value::Dict GetParameters() const override; 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker // For constructor calling. 85*6777b538SAndroid Build Coastguard Worker friend class SparseHistogramTest; 86*6777b538SAndroid Build Coastguard Worker friend class HistogramThreadsafeTest; 87*6777b538SAndroid Build Coastguard Worker 88*6777b538SAndroid Build Coastguard Worker // Protects access to |samples_|. 89*6777b538SAndroid Build Coastguard Worker mutable base::Lock lock_; 90*6777b538SAndroid Build Coastguard Worker 91*6777b538SAndroid Build Coastguard Worker // Flag to indicate if PrepareFinalDelta has been previously called. 92*6777b538SAndroid Build Coastguard Worker mutable bool final_delta_created_ = false; 93*6777b538SAndroid Build Coastguard Worker 94*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HistogramSamples> unlogged_samples_; 95*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HistogramSamples> logged_samples_; 96*6777b538SAndroid Build Coastguard Worker }; 97*6777b538SAndroid Build Coastguard Worker 98*6777b538SAndroid Build Coastguard Worker } // namespace base 99*6777b538SAndroid Build Coastguard Worker 100*6777b538SAndroid Build Coastguard Worker #endif // BASE_METRICS_SPARSE_HISTOGRAM_H_ 101