Index: base/metrics/statistics_recorder.cc |
diff --git a/base/metrics/statistics_recorder.cc b/base/metrics/statistics_recorder.cc |
index 87ffa3dbcd04e78a724a3bec71b650726bdce79c..15e48d8ae622d3572467c93800a0b4caf6547c21 100644 |
--- a/base/metrics/statistics_recorder.cc |
+++ b/base/metrics/statistics_recorder.cc |
@@ -10,6 +10,7 @@ |
#include "base/logging.h" |
#include "base/memory/scoped_ptr.h" |
#include "base/metrics/histogram.h" |
+#include "base/metrics/metrics_hashes.h" |
#include "base/stl_util.h" |
#include "base/strings/stringprintf.h" |
#include "base/synchronization/lock.h" |
@@ -58,9 +59,10 @@ HistogramBase* StatisticsRecorder::RegisterOrDeleteDuplicate( |
histogram_to_return = histogram; |
} else { |
const std::string& name = histogram->histogram_name(); |
- HistogramMap::iterator it = histograms_->find(HistogramNameRef(name)); |
+ uint64_t name_hash = histogram->name_hash(); |
+ HistogramMap::iterator it = histograms_->find(name_hash); |
if (histograms_->end() == it) { |
- (*histograms_)[HistogramNameRef(name)] = histogram; |
+ (*histograms_)[name_hash] = histogram; |
ANNOTATE_LEAKING_OBJECT_PTR(histogram); // see crbug.com/79322 |
// If there are callbacks for this histogram, we set the kCallbackExists |
// flag. |
@@ -77,6 +79,8 @@ HistogramBase* StatisticsRecorder::RegisterOrDeleteDuplicate( |
histogram_to_return = histogram; |
} else { |
// We already have one histogram with this name. |
+ DCHECK_EQ(histogram->histogram_name(), |
+ it->second->histogram_name()) << "hash collision"; |
histogram_to_return = it->second; |
histogram_to_delete = histogram; |
} |
@@ -200,7 +204,7 @@ void StatisticsRecorder::GetHistograms(Histograms* output) { |
return; |
for (const auto& entry : *histograms_) { |
- DCHECK_EQ(entry.first.name_, entry.second->histogram_name()); |
+ DCHECK_EQ(entry.first, entry.second->name_hash()); |
output->push_back(entry.second); |
} |
} |
@@ -229,9 +233,10 @@ HistogramBase* StatisticsRecorder::FindHistogram(const std::string& name) { |
if (histograms_ == NULL) |
return NULL; |
- HistogramMap::iterator it = histograms_->find(HistogramNameRef(name)); |
+ HistogramMap::iterator it = histograms_->find(HashMetricName(name)); |
if (histograms_->end() == it) |
return NULL; |
+ DCHECK_EQ(name, it->second->histogram_name()) << "hash collision"; |
return it->second; |
} |
@@ -250,9 +255,11 @@ bool StatisticsRecorder::SetCallback( |
return false; |
callbacks_->insert(std::make_pair(name, cb)); |
- auto histogram_iterator = histograms_->find(HistogramNameRef(name)); |
- if (histogram_iterator != histograms_->end()) |
- histogram_iterator->second->SetFlags(HistogramBase::kCallbackExists); |
+ HistogramMap::iterator it = histograms_->find(HashMetricName(name)); |
+ if (it != histograms_->end()) { |
+ DCHECK_EQ(name, it->second->histogram_name()) << "hash collision"; |
+ it->second->SetFlags(HistogramBase::kCallbackExists); |
+ } |
return true; |
} |
@@ -268,9 +275,11 @@ void StatisticsRecorder::ClearCallback(const std::string& name) { |
callbacks_->erase(name); |
// We also clear the flag from the histogram (if it exists). |
- auto histogram_iterator = histograms_->find(HistogramNameRef(name)); |
- if (histogram_iterator != histograms_->end()) |
- histogram_iterator->second->ClearFlags(HistogramBase::kCallbackExists); |
+ HistogramMap::iterator it = histograms_->find(HashMetricName(name)); |
+ if (it != histograms_->end()) { |
+ DCHECK_EQ(name, it->second->histogram_name()) << "hash collision"; |
+ it->second->ClearFlags(HistogramBase::kCallbackExists); |
+ } |
} |
// static |
@@ -297,7 +306,7 @@ void StatisticsRecorder::GetSnapshot(const std::string& query, |
return; |
for (const auto& entry : *histograms_) { |
- if (entry.first.name_.find(query) != std::string::npos) |
+ if (entry.second->histogram_name().find(query) != std::string::npos) |
snapshot->push_back(entry.second); |
} |
} |