| Index: base/metrics/histogram.cc
|
| ===================================================================
|
| --- base/metrics/histogram.cc (revision 87216)
|
| +++ base/metrics/histogram.cc (working copy)
|
| @@ -14,6 +14,7 @@
|
| #include <algorithm>
|
| #include <string>
|
|
|
| +#include "base/debug/leak_annotations.h"
|
| #include "base/logging.h"
|
| #include "base/pickle.h"
|
| #include "base/stringprintf.h"
|
| @@ -1030,17 +1031,27 @@
|
| }
|
|
|
| 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;
|
|
|