1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef BASE_METRICS_SPARSE_HISTOGRAM_H_
6#define BASE_METRICS_SPARSE_HISTOGRAM_H_
7
8#include <map>
9#include <string>
10
11#include "base/base_export.h"
12#include "base/basictypes.h"
13#include "base/compiler_specific.h"
14#include "base/logging.h"
15#include "base/memory/scoped_ptr.h"
16#include "base/metrics/histogram_base.h"
17#include "base/metrics/sample_map.h"
18#include "base/synchronization/lock.h"
19
20namespace base {
21
22#define UMA_HISTOGRAM_SPARSE_SLOWLY(name, sample) \
23    do { \
24      base::HistogramBase* histogram = base::SparseHistogram::FactoryGet( \
25          name, base::HistogramBase::kUmaTargetedHistogramFlag); \
26      histogram->Add(sample); \
27    } while (0)
28
29class HistogramSamples;
30
31class BASE_EXPORT_PRIVATE SparseHistogram : public HistogramBase {
32 public:
33  // If there's one with same name, return the existing one. If not, create a
34  // new one.
35  static HistogramBase* FactoryGet(const std::string& name, int32 flags);
36
37  virtual ~SparseHistogram();
38
39  // HistogramBase implementation:
40  virtual HistogramType GetHistogramType() const OVERRIDE;
41  virtual bool HasConstructionArguments(
42      Sample expected_minimum,
43      Sample expected_maximum,
44      size_t expected_bucket_count) const OVERRIDE;
45  virtual void Add(Sample value) OVERRIDE;
46  virtual void AddSamples(const HistogramSamples& samples) OVERRIDE;
47  virtual bool AddSamplesFromPickle(PickleIterator* iter) OVERRIDE;
48  virtual scoped_ptr<HistogramSamples> SnapshotSamples() const OVERRIDE;
49  virtual void WriteHTMLGraph(std::string* output) const OVERRIDE;
50  virtual void WriteAscii(std::string* output) const OVERRIDE;
51
52 protected:
53  // HistogramBase implementation:
54  virtual bool SerializeInfoImpl(Pickle* pickle) const OVERRIDE;
55
56 private:
57  // Clients should always use FactoryGet to create SparseHistogram.
58  explicit SparseHistogram(const std::string& name);
59
60  friend BASE_EXPORT_PRIVATE HistogramBase* DeserializeHistogramInfo(
61      PickleIterator* iter);
62  static HistogramBase* DeserializeInfoImpl(PickleIterator* iter);
63
64  virtual void GetParameters(DictionaryValue* params) const OVERRIDE;
65  virtual void GetCountAndBucketData(Count* count,
66                                     int64* sum,
67                                     ListValue* buckets) const OVERRIDE;
68
69  // Helpers for emitting Ascii graphic.  Each method appends data to output.
70  void WriteAsciiImpl(bool graph_it,
71                      const std::string& newline,
72                      std::string* output) const;
73
74  // Write a common header message describing this histogram.
75  void WriteAsciiHeader(const Count total_count,
76                        std::string* output) const;
77
78  // For constuctor calling.
79  friend class SparseHistogramTest;
80
81  // Protects access to |samples_|.
82  mutable base::Lock lock_;
83
84  SampleMap samples_;
85
86  DISALLOW_COPY_AND_ASSIGN(SparseHistogram);
87};
88
89}  // namespace base
90
91#endif  // BASE_METRICS_SPARSE_HISTOGRAM_H_
92