Index: webrtc/system_wrappers/source/metrics_default.cc |
diff --git a/webrtc/system_wrappers/source/metrics_default.cc b/webrtc/system_wrappers/source/metrics_default.cc |
index 6ca90dafdc84933c8805f0f550809c1ceb36fe66..e1e4e807b3487ffe9902b63329ab498ea7c121e9 100644 |
--- a/webrtc/system_wrappers/source/metrics_default.cc |
+++ b/webrtc/system_wrappers/source/metrics_default.cc |
@@ -253,6 +253,18 @@ const std::string& GetHistogramName(Histogram* histogram_pointer) { |
// Fast path. Adds |sample| to cached |histogram_pointer|. |
void HistogramAdd(Histogram* histogram_pointer, int sample) { |
+ if (g_rtc_histogram_map == nullptr) { |
+ // Histograms are disabled, so the pointer is invalid. Check on this instead |
+ // of histogram_pointer being NULL so that we don't accidentally miss |
+ // instances where HistogramAdd(histogram_, sample) is called with |
+ // histogram_ uninitialized. |
+ // |
+ // This doesn't happen in Chromium since base::Histogram::FactoryGet and |
+ // base::LinearHistogram::FactoryGet always return valid base::HistogramBase |
+ // pointers. We could consider returning a null object, but having |
+ // RtcHistogram virtual makes function calls to it slower. |
+ return; |
+ } |
RtcHistogram* ptr = reinterpret_cast<RtcHistogram*>(histogram_pointer); |
ptr->Add(sample); |
} |
@@ -267,6 +279,8 @@ SampleInfo::~SampleInfo() {} |
// Implementation of global functions in metrics_default.h. |
void Enable() { |
+ // TODO(pbos): Make sure that no callers have called HistogramFactoryGet*, |
+ // HistogramAdd or GetMap() at this point. |
RTC_DCHECK(g_rtc_histogram_map == nullptr); |
#if RTC_DCHECK_IS_ON |
RTC_DCHECK_EQ(0, rtc::AtomicOps::AcquireLoad(&g_rtc_histogram_called)); |