xref: /aosp_15_r20/external/cronet/base/metrics/sparse_histogram.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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