Index: ui/events/event.cc |
diff --git a/ui/events/event.cc b/ui/events/event.cc |
index e391e207f4fce6afc687c3d79875dfb9fa74bf98..6548405f179299cc34a2276d462b044423915eee 100644 |
--- a/ui/events/event.cc |
+++ b/ui/events/event.cc |
@@ -41,6 +41,39 @@ |
#include "ui/events/keycodes/platform_key_map_win.h" |
#endif |
+// Support a collection of histograms, perhaps one for each entry in an |
+// enumeration. This macro manages a block of pointers, adding to a specific |
+// one by its index. |
+// |
+// A typical instantiation looks something like this: |
+// STATIC_HISTOGRAM_POINTER_GROUP( |
+// GetHistogramNameForIndex(histogram_index), |
+// histogram_index, MAXIMUM_HISTOGRAM_INDEX, Add(some_delta), |
+// base::Histogram::FactoryGet( |
+// GetHistogramNameForType(histogram_index), |
+// MINIMUM_SAMPLE, MAXIMUM_SAMPLE, BUCKET_COUNT, |
+// base::HistogramBase::kUmaTargetedHistogramFlag)); |
+// |
+// Though it seems inefficient to generate the name twice, the first |
+// instance will be used only for DCHECK builds and the second will |
+// execute only during the first access to the given index, after which |
+// the pointer is cached and the name never needed again. |
+// |
+// This is defined in this way so that it can be moved unchanged into |
+// base/metrics/histogram_macros.h if it is useful in other files. |
+#define STATIC_HISTOGRAM_POINTER_GROUP(constant_histogram_name, index, \ |
+ constant_maximum, \ |
+ histogram_add_method_invocation, \ |
+ histogram_factory_get_invocation) \ |
+ do { \ |
+ static base::subtle::AtomicWord atomic_histograms[constant_maximum]; \ |
+ DCHECK_LE(0, index); \ |
+ DCHECK_LT(index, constant_maximum); \ |
+ HISTOGRAM_POINTER_USE(&atomic_histograms[index], constant_histogram_name, \ |
+ histogram_add_method_invocation, \ |
+ histogram_factory_get_invocation); \ |
+ } while (0) |
+ |
namespace { |
std::string EventTypeName(ui::EventType type) { |
@@ -312,16 +345,17 @@ Event::Event(const base::NativeEvent& native_event, |
static_cast<base::HistogramBase::Sample>(delta.InMicroseconds()); |
UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.Browser", delta_sample, 1, 1000000, |
100); |
- std::string name_for_event = |
- base::StringPrintf("Event.Latency.Browser.%s", name_.c_str()); |
- base::HistogramBase* counter_for_type = |
+ |
+ // Though it seems inefficient to generate the string twice, the first |
+ // instance will be used only for DCHECK builds and the second won't be |
+ // executed at all if the histogram was previously accessed here. |
+ STATIC_HISTOGRAM_POINTER_GROUP( |
+ base::StringPrintf("Event.Latency.Browser.%s", name_.c_str()), |
+ type_, ET_LAST, Add(delta_sample), |
base::Histogram::FactoryGet( |
- name_for_event, |
- 1, |
- 1000000, |
- 100, |
- base::HistogramBase::kUmaTargetedHistogramFlag); |
- counter_for_type->Add(delta_sample); |
+ base::StringPrintf("Event.Latency.Browser.%s", name_.c_str()), |
+ 1, 1000000, 100, |
+ base::HistogramBase::kUmaTargetedHistogramFlag)); |
#if defined(USE_X11) |
if (native_event->type == GenericEvent) { |