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. |