Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2374)

Unified Diff: base/histogram.h

Issue 515033: Cleanup histogram classes mixing SetFlags into FactoryGet arguments... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | base/histogram.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/histogram.h
===================================================================
--- base/histogram.h (revision 35277)
+++ base/histogram.h (working copy)
@@ -44,92 +44,59 @@
// Provide easy general purpose histogram in a macro, just like stats counters.
// The first four macros use 50 buckets.
-#define HISTOGRAM_TIMES(name, sample) do { \
- static scoped_refptr<Histogram> counter = Histogram::HistogramFactoryGet(\
- (name), base::TimeDelta::FromMilliseconds(1), \
- base::TimeDelta::FromSeconds(10), 50); \
- counter->AddTime(sample); \
- } while (0)
+#define HISTOGRAM_TIMES(name, sample) HISTOGRAM_CUSTOM_TIMES( \
+ name, sample, base::TimeDelta::FromMilliseconds(1), \
+ base::TimeDelta::FromSeconds(10), 50)
-#define HISTOGRAM_COUNTS(name, sample) do { \
- static scoped_refptr<Histogram> counter = Histogram::HistogramFactoryGet(\
- (name), 1, 1000000, 50); \
- counter->Add(sample); \
- } while (0)
+#define HISTOGRAM_COUNTS(name, sample) HISTOGRAM_CUSTOM_COUNTS( \
+ name, sample, 1, 1000000, 50)
-#define HISTOGRAM_COUNTS_100(name, sample) do { \
- static scoped_refptr<Histogram> counter = Histogram::HistogramFactoryGet(\
- (name), 1, 100, 50); \
- counter->Add(sample); \
- } while (0)
+#define HISTOGRAM_COUNTS_100(name, sample) HISTOGRAM_CUSTOM_COUNTS( \
+ name, sample, 1, 100, 50)
-#define HISTOGRAM_COUNTS_10000(name, sample) do { \
- static scoped_refptr<Histogram> counter = Histogram::HistogramFactoryGet(\
- (name), 1, 10000, 50); \
- counter->Add(sample); \
- } while (0)
+#define HISTOGRAM_COUNTS_10000(name, sample) HISTOGRAM_CUSTOM_COUNTS( \
+ name, sample, 1, 10000, 50)
#define HISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, bucket_count) do { \
- static scoped_refptr<Histogram> counter = Histogram::HistogramFactoryGet(\
- (name), min, max, bucket_count); \
+ static scoped_refptr<Histogram> counter = Histogram::FactoryGet( \
+ name, min, max, bucket_count, Histogram::kNoFlags); \
counter->Add(sample); \
} while (0)
-#define HISTOGRAM_PERCENTAGE(name, under_one_hundred) do { \
- static scoped_refptr<Histogram> counter = \
- LinearHistogram::LinearHistogramFactoryGet(\
- (name), 1, 100, 101); \
- counter->Add(under_one_hundred); \
- } while (0)
+#define HISTOGRAM_PERCENTAGE(name, under_one_hundred) \
+ HISTOGRAM_ENUMERATION(name, under_one_hundred, 101)
// For folks that need real specific times, use this to select a precise range
// of times you want plotted, and the number of buckets you want used.
#define HISTOGRAM_CUSTOM_TIMES(name, sample, min, max, bucket_count) do { \
- static scoped_refptr<Histogram> counter = Histogram::HistogramFactoryGet(\
- (name), min, max, bucket_count); \
+ static scoped_refptr<Histogram> counter = Histogram::FactoryGet( \
+ name, min, max, bucket_count, Histogram::kNoFlags); \
counter->AddTime(sample); \
} while (0)
// DO NOT USE THIS. It is being phased out, in favor of HISTOGRAM_CUSTOM_TIMES.
#define HISTOGRAM_CLIPPED_TIMES(name, sample, min, max, bucket_count) do { \
- static scoped_refptr<Histogram> counter = Histogram::HistogramFactoryGet(\
- (name), min, max, bucket_count); \
+ static scoped_refptr<Histogram> counter = Histogram::FactoryGet( \
+ name, min, max, bucket_count, Histogram::kNoFlags); \
if ((sample) < (max)) counter->AddTime(sample); \
} while (0)
-//------------------------------------------------------------------------------
-// This macro set is for a histogram that can support both addition and removal
-// of samples. It should be used to render the accumulated asset allocation
-// of some samples. For example, it can sample memory allocation sizes, and
-// memory releases (as negative samples).
-// To simplify the interface, only non-zero values can be sampled, with positive
-// numbers indicating addition, and negative numbers implying dimunition
-// (removal).
-// Note that the underlying ThreadSafeHistogram() uses locking to ensure that
-// counts are precise (no chance of losing an addition or removal event, due to
-// multithread racing). This precision is required to prevent missed-counts from
-// resulting in drift, as the calls to Remove() for a given value should always
-// be equal in number or fewer than the corresponding calls to Add().
+// Support histograming of an enumerated value. The samples should always be
+// less than boundary_value.
-#define ASSET_HISTOGRAM_COUNTS(name, sample) do { \
- static scoped_refptr<Histogram> counter = \
- ThreadSafeHistogram::ThreadSafeHistogramFactoryGet(\
- (name), 1, 1000000, 50); \
- if (0 == sample) break; \
- if (sample >= 0) \
- counter->Add(sample); \
- else\
- counter->Remove(-sample); \
+#define HISTOGRAM_ENUMERATION(name, sample, boundary_value) do { \
+ static scoped_refptr<Histogram> counter = LinearHistogram::FactoryGet( \
+ name, 1, boundary_value, boundary_value + 1, Histogram::kNoFlags); \
+ counter->Add(sample); \
} while (0)
+
//------------------------------------------------------------------------------
// Define Debug vs non-debug flavors of macros.
#ifndef NDEBUG
#define DHISTOGRAM_TIMES(name, sample) HISTOGRAM_TIMES(name, sample)
#define DHISTOGRAM_COUNTS(name, sample) HISTOGRAM_COUNTS(name, sample)
-#define DASSET_HISTOGRAM_COUNTS(name, sample) ASSET_HISTOGRAM_COUNTS(name, \
- sample)
#define DHISTOGRAM_PERCENTAGE(name, under_one_hundred) HISTOGRAM_PERCENTAGE(\
name, under_one_hundred)
#define DHISTOGRAM_CUSTOM_TIMES(name, sample, min, max, bucket_count) \
@@ -137,22 +104,23 @@
#define DHISTOGRAM_CLIPPED_TIMES(name, sample, min, max, bucket_count) \
HISTOGRAM_CLIPPED_TIMES(name, sample, min, max, bucket_count)
#define DHISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, bucket_count) \
- HISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, bucket_count)
+ HISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, bucket_count)
+#define DHISTOGRAM_ENUMERATION(name, sample, boundary_value) \
+ HISTOGRAM_ENUMERATION(name, sample, boundary_value)
#else // NDEBUG
#define DHISTOGRAM_TIMES(name, sample) do {} while (0)
#define DHISTOGRAM_COUNTS(name, sample) do {} while (0)
-#define DASSET_HISTOGRAM_COUNTS(name, sample) do {} while (0)
#define DHISTOGRAM_PERCENTAGE(name, under_one_hundred) do {} while (0)
#define DHISTOGRAM_CUSTOM_TIMES(name, sample, min, max, bucket_count) \
do {} while (0)
#define DHISTOGRAM_CLIPPED_TIMES(name, sample, min, max, bucket_count) \
do {} while (0)
#define DHISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, bucket_count) \
- do {} while (0)
+ do {} while (0)
+#define DHISTOGRAM_ENUMERATION(name, sample, boundary_value) do {} while (0)
-
#endif // NDEBUG
//------------------------------------------------------------------------------
@@ -161,109 +129,64 @@
// Not all systems support such UMA, but if they do, the following macros
// should work with the service.
-static const int kUmaTargetedHistogramFlag = 0x1;
+#define UMA_HISTOGRAM_TIMES(name, sample) UMA_HISTOGRAM_CUSTOM_TIMES( \
+ name, sample, base::TimeDelta::FromMilliseconds(1), \
+ base::TimeDelta::FromSeconds(10), 50)
-// This indicates the histogram is pickled to be sent across an IPC Channel.
-// If we observe this flag during unpickle method, then we are running in a
-// single process mode.
-static const int kIPCSerializationSourceFlag = 1 << 4;
+#define UMA_HISTOGRAM_MEDIUM_TIMES(name, sample) UMA_HISTOGRAM_CUSTOM_TIMES( \
+ name, sample, base::TimeDelta::FromMilliseconds(10), \
+ base::TimeDelta::FromMinutes(3), 50)
-// Some histograms aren't currently destroyed. Until such users properly
-// decref those histograms, we will mark there histograms as planned to leak so
-// that we can catch any user that directly tries to call delete "directly"
-// rather than using the reference counting features that should take care of
-// this.
-// TODO(jar): Make this flag unnecessary!
-static const int kPlannedLeakFlag = 1 << 5;
-
-#define UMA_HISTOGRAM_TIMES(name, sample) do { \
- static scoped_refptr<Histogram> counter = Histogram::HistogramFactoryGet(\
- (name), base::TimeDelta::FromMilliseconds(1), \
- base::TimeDelta::FromSeconds(10), 50); \
- counter->SetFlags(kUmaTargetedHistogramFlag); \
- counter->AddTime(sample); \
- } while (0)
-
-#define UMA_HISTOGRAM_MEDIUM_TIMES(name, sample) do { \
- static scoped_refptr<Histogram> counter = Histogram::HistogramFactoryGet(\
- (name), base::TimeDelta::FromMilliseconds(10), \
- base::TimeDelta::FromMinutes(3), 50); \
- counter->SetFlags(kUmaTargetedHistogramFlag); \
- counter->AddTime(sample); \
- } while (0)
-
// Use this macro when times can routinely be much longer than 10 seconds.
-#define UMA_HISTOGRAM_LONG_TIMES(name, sample) do { \
- static scoped_refptr<Histogram> counter = Histogram::HistogramFactoryGet(\
- (name), base::TimeDelta::FromMilliseconds(1), \
- base::TimeDelta::FromHours(1), 50); \
- counter->SetFlags(kUmaTargetedHistogramFlag); \
- counter->AddTime(sample); \
- } while (0)
+#define UMA_HISTOGRAM_LONG_TIMES(name, sample) UMA_HISTOGRAM_CUSTOM_TIMES( \
+ name, sample, base::TimeDelta::FromMilliseconds(1), \
+ base::TimeDelta::FromHours(1), 50)
#define UMA_HISTOGRAM_CUSTOM_TIMES(name, sample, min, max, bucket_count) do { \
- static scoped_refptr<Histogram> counter = Histogram::HistogramFactoryGet(\
- (name), min, max, bucket_count); \
- counter->SetFlags(kUmaTargetedHistogramFlag); \
+ static scoped_refptr<Histogram> counter = Histogram::FactoryGet( \
+ name, min, max, bucket_count, Histogram::kUmaTargetedHistogramFlag); \
counter->AddTime(sample); \
} while (0)
+// DO NOT USE THIS. It is being phased out, in favor of HISTOGRAM_CUSTOM_TIMES.
#define UMA_HISTOGRAM_CLIPPED_TIMES(name, sample, min, max, bucket_count) do { \
- static scoped_refptr<Histogram> counter = Histogram::HistogramFactoryGet(\
- (name), min, max, bucket_count); \
- counter->SetFlags(kUmaTargetedHistogramFlag); \
+ static scoped_refptr<Histogram> counter = Histogram::FactoryGet( \
+ name, min, max, bucket_count, Histogram::kUmaTargetedHistogramFlag); \
if ((sample) < (max)) counter->AddTime(sample); \
} while (0)
-#define UMA_HISTOGRAM_COUNTS(name, sample) do { \
- static scoped_refptr<Histogram> counter = Histogram::HistogramFactoryGet(\
- (name), 1, 1000000, 50); \
- counter->SetFlags(kUmaTargetedHistogramFlag); \
- counter->Add(sample); \
- } while (0)
+#define UMA_HISTOGRAM_COUNTS(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS( \
+ name, sample, 1, 1000000, 50)
-#define UMA_HISTOGRAM_COUNTS_100(name, sample) do { \
- static scoped_refptr<Histogram> counter = Histogram::HistogramFactoryGet(\
- (name), 1, 100, 50); \
- counter->SetFlags(kUmaTargetedHistogramFlag); \
- counter->Add(sample); \
- } while (0)
+#define UMA_HISTOGRAM_COUNTS_100(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS( \
+ name, sample, 1, 100, 50)
-#define UMA_HISTOGRAM_COUNTS_10000(name, sample) do { \
- static scoped_refptr<Histogram> counter = Histogram::HistogramFactoryGet(\
- (name), 1, 10000, 50); \
- counter->SetFlags(kUmaTargetedHistogramFlag); \
- counter->Add(sample); \
- } while (0)
+#define UMA_HISTOGRAM_COUNTS_10000(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS( \
+ name, sample, 1, 10000, 50)
#define UMA_HISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, bucket_count) do { \
- static scoped_refptr<Histogram> counter = Histogram::HistogramFactoryGet(\
- (name), min, max, bucket_count); \
- counter->SetFlags(kUmaTargetedHistogramFlag); \
+ static scoped_refptr<Histogram> counter = Histogram::FactoryGet( \
+ name, min, max, bucket_count, Histogram::kUmaTargetedHistogramFlag); \
counter->Add(sample); \
} while (0)
-#define UMA_HISTOGRAM_MEMORY_KB(name, sample) do { \
- static scoped_refptr<Histogram> counter = Histogram::HistogramFactoryGet(\
- (name), 1000, 500000, 50); \
- counter->SetFlags(kUmaTargetedHistogramFlag); \
- counter->Add(sample); \
- } while (0)
+#define UMA_HISTOGRAM_MEMORY_KB(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS( \
+ name, sample, 1000, 500000, 50)
-#define UMA_HISTOGRAM_MEMORY_MB(name, sample) do { \
- static scoped_refptr<Histogram> counter = Histogram::HistogramFactoryGet(\
- (name), 1, 1000, 50); \
- counter->SetFlags(kUmaTargetedHistogramFlag); \
+#define UMA_HISTOGRAM_MEMORY_MB(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS( \
+ name, sample, 1, 1000, 50)
+
+#define UMA_HISTOGRAM_PERCENTAGE(name, under_one_hundred) \
+ UMA_HISTOGRAM_ENUMERATION(name, under_one_hundred, 101)
+
+#define UMA_HISTOGRAM_ENUMERATION(name, sample, boundary_value) do { \
+ DCHECK(sample < boundary_value); \
+ static scoped_refptr<Histogram> counter = LinearHistogram::FactoryGet( \
+ name, 1, boundary_value, boundary_value + 1, \
+ Histogram::kUmaTargetedHistogramFlag); \
counter->Add(sample); \
} while (0)
-#define UMA_HISTOGRAM_PERCENTAGE(name, under_one_hundred) do { \
- static scoped_refptr<Histogram> counter = \
- LinearHistogram::LinearHistogramFactoryGet(\
- (name), 1, 100, 101); \
- counter->SetFlags(kUmaTargetedHistogramFlag); \
- counter->Add(under_one_hundred); \
- } while (0)
//------------------------------------------------------------------------------
@@ -271,7 +194,6 @@
class Histogram;
class LinearHistogram;
class BooleanHistogram;
-class ThreadSafeHistogram;
namespace disk_cache {
class StatsHistogram;
@@ -287,15 +209,12 @@
typedef std::vector<Count> Counts;
typedef std::vector<Sample> Ranges;
- static const int kHexRangePrintingFlag;
-
/* These enums are meant to facilitate deserialization of renderer histograms
into the browser. */
enum ClassType {
HISTOGRAM,
LINEAR_HISTOGRAM,
BOOLEAN_HISTOGRAM,
- THREAD_SAFE_HISTOGRAM,
NOT_VALID_IN_RENDERER
};
@@ -304,6 +223,20 @@
LINEAR
};
+ enum Flags {
+ kNoFlags = 0,
+ kUmaTargetedHistogramFlag = 0x1, // Histogram should be UMA uploaded.
+
+ // Indicate that the histogram was pickled to be sent across an IPC Channel.
+ // If we observe this flag on a histogram being aggregated into after IPC,
+ // then we are running in a single process mode, and the aggregation should
+ // not take place (as we would be aggregating back into the source
+ // histogram!).
+ kIPCSerializationSourceFlag = 0x10,
+
+ kHexRangePrintingFlag = 0x8000, // Fancy bucket-naming supported.
+ };
+
struct DescriptionPair {
Sample sample;
const char* description; // Null means end of a list of pairs.
@@ -348,10 +281,11 @@
//----------------------------------------------------------------------------
// minimum should start from 1. 0 is invalid as a minimum. 0 is an implicit
// default underflow bucket.
- static scoped_refptr<Histogram> HistogramFactoryGet(const std::string& name,
- Sample minimum, Sample maximum, size_t bucket_count);
- static scoped_refptr<Histogram> HistogramFactoryGet(const std::string& name,
- base::TimeDelta minimum, base::TimeDelta maximum, size_t bucket_count);
+ static scoped_refptr<Histogram> FactoryGet(const std::string& name,
+ Sample minimum, Sample maximum, size_t bucket_count, Flags flags);
+ static scoped_refptr<Histogram> FactoryGet(const std::string& name,
+ base::TimeDelta minimum, base::TimeDelta maximum, size_t bucket_count,
+ Flags flags);
void Add(int value);
@@ -365,9 +299,6 @@
void AddSampleSet(const SampleSet& sample);
- // This method is an interface, used only by ThreadSafeHistogram.
- virtual void Remove(int value) { DCHECK(false); }
-
// This method is an interface, used only by LinearHistogram.
virtual void SetRangeDescriptions(const DescriptionPair descriptions[])
{ DCHECK(false); }
@@ -380,8 +311,8 @@
// Support generic flagging of Histograms.
// 0x1 Currently used to mark this histogram to be recorded by UMA..
// 0x8000 means print ranges in hex.
- void SetFlags(int flags) { flags_ |= flags; }
- void ClearFlags(int flags) { flags_ &= ~flags; }
+ void SetFlags(Flags flags) { flags_ = static_cast<Flags> (flags_ | flags); }
+ void ClearFlags(Flags flags) { flags_ = static_cast<Flags>(flags_ & ~flags); }
int flags() const { return flags_; }
// Convenience methods for serializing/deserializing the histograms.
@@ -510,7 +441,7 @@
size_t bucket_count_; // Dimension of counts_[].
// Flag the histogram for recording by UMA via metric_services.h.
- int flags_;
+ Flags flags_;
// For each index, show the least value that can be stored in the
// corresponding bucket. We also append one extra element in this array,
@@ -539,12 +470,11 @@
/* minimum should start from 1. 0 is as minimum is invalid. 0 is an implicit
default underflow bucket. */
- static scoped_refptr<Histogram> LinearHistogramFactoryGet(
- const std::string& name, Sample minimum, Sample maximum,
- size_t bucket_count);
- static scoped_refptr<Histogram> LinearHistogramFactoryGet(
- const std::string& name, base::TimeDelta minimum,
- base::TimeDelta maximum, size_t bucket_count);
+ static scoped_refptr<Histogram> FactoryGet(const std::string& name,
+ Sample minimum, Sample maximum, size_t bucket_count, Flags flags);
+ static scoped_refptr<Histogram> FactoryGet(const std::string& name,
+ base::TimeDelta minimum, base::TimeDelta maximum, size_t bucket_count,
+ Flags flags);
protected:
LinearHistogram(const std::string& name, Sample minimum,
@@ -582,8 +512,8 @@
// BooleanHistogram is a histogram for booleans.
class BooleanHistogram : public LinearHistogram {
public:
- static scoped_refptr<Histogram> BooleanHistogramFactoryGet(
- const std::string& name);
+ static scoped_refptr<Histogram> FactoryGet(const std::string& name,
+ Flags flags);
virtual ClassType histogram_type() const { return BOOLEAN_HISTOGRAM; }
@@ -591,45 +521,13 @@
private:
explicit BooleanHistogram(const std::string& name)
- : LinearHistogram(name, 1, 2, 3) {
+ : LinearHistogram(name, 1, 2, 3) {
}
DISALLOW_COPY_AND_ASSIGN(BooleanHistogram);
};
//------------------------------------------------------------------------------
-// This section provides implementation for ThreadSafeHistogram.
-//------------------------------------------------------------------------------
-
-class ThreadSafeHistogram : public Histogram {
- public:
- static scoped_refptr<Histogram> ThreadSafeHistogramFactoryGet(
- const std::string& name, Sample minimum, Sample maximum,
- size_t bucket_count);
-
- virtual ClassType histogram_type() const { return THREAD_SAFE_HISTOGRAM; }
-
- // Provide the analog to Add()
- virtual void Remove(int value);
-
- protected:
- ThreadSafeHistogram(const std::string& name, Sample minimum,
- Sample maximum, size_t bucket_count);
-
- virtual ~ThreadSafeHistogram() {}
-
- // Provide locked versions to get precise counts.
- virtual void Accumulate(Sample value, Count count, size_t index);
-
- virtual void SnapshotSample(SampleSet* sample) const;
-
- private:
- mutable Lock lock_;
-
- DISALLOW_COPY_AND_ASSIGN(ThreadSafeHistogram);
-};
-
-//------------------------------------------------------------------------------
// StatisticsRecorder handles all histograms in the system. It provides a
// general place for histograms to register, and supports a global API for
// accessing (i.e., dumping, or graphing) the data in all the histograms.
« no previous file with comments | « no previous file | base/histogram.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698