From 9b3bbd6118178652747f138fab1fc9ed045d4e0e Mon Sep 17 00:00:00 2001 From: "glider@chromium.org" Date: Tue, 31 May 2011 07:37:09 +0000 Subject: Introduce the ANNOTATE_LEAKING_OBJECT_PTR annotation that can be used to mark heap allocated objects as intentionally leaked ones. Annotate the histograms produced by {Histogram,BooleanHistogram,LinearHistogram,CustomHistogram}::FactoryGet(), as leaked. Rename StatsHistogram::StatsHistogramFactoryGet to StatsHistogram::FactoryGet, annotate the result as leaky, update the suppressions. BUG=79322 Review URL: http://codereview.chromium.org/7071036 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@87278 0039d316-1c4b-4281-b951-d872f2087c98 --- base/metrics/histogram.cc | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'base/metrics') diff --git a/base/metrics/histogram.cc b/base/metrics/histogram.cc index 63e5ae6..2441c51 100644 --- a/base/metrics/histogram.cc +++ b/base/metrics/histogram.cc @@ -14,6 +14,7 @@ #include #include +#include "base/debug/leak_annotations.h" #include "base/logging.h" #include "base/pickle.h" #include "base/stringprintf.h" @@ -1030,17 +1031,27 @@ bool StatisticsRecorder::IsActive() { } Histogram* StatisticsRecorder::RegisterOrDeleteDuplicate(Histogram* histogram) { + // As per crbug.com/79322 the histograms are intentionally leaked, so we need + // to annotate them. Because ANNOTATE_LEAKING_OBJECT_PTR may be used only once + // for an object, the duplicates should not be annotated. + // Callers are responsible for not calling RegisterOrDeleteDuplicate(ptr) + // twice if (lock_ == NULL) || (!histograms_). DCHECK(histogram->HasValidRangeChecksum()); - if (lock_ == NULL) + if (lock_ == NULL) { + ANNOTATE_LEAKING_OBJECT_PTR(histogram); // see crbug.com/79322 return histogram; + } base::AutoLock auto_lock(*lock_); - if (!histograms_) + if (!histograms_) { + ANNOTATE_LEAKING_OBJECT_PTR(histogram); // see crbug.com/79322 return histogram; + } const std::string name = histogram->histogram_name(); HistogramMap::iterator it = histograms_->find(name); // Avoid overwriting a previous registration. if (histograms_->end() == it) { (*histograms_)[name] = histogram; + ANNOTATE_LEAKING_OBJECT_PTR(histogram); // see crbug.com/79322 } else { delete histogram; // We already have one by this name. histogram = it->second; -- cgit v1.1