Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(425)

Unified Diff: base/metrics/histogram.cc

Issue 2867303004: [histogram] Make histograms more resistant to overflows. (Closed)
Patch Set: addressed comments from isherman@ Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/metrics/histogram.cc
diff --git a/base/metrics/histogram.cc b/base/metrics/histogram.cc
index c35f76ce5548d8f0264f26fbeefab9c5d62aea82..bba04c928cb3ca743dcc07e284ff3ac5a858bc24 100644
--- a/base/metrics/histogram.cc
+++ b/base/metrics/histogram.cc
@@ -414,7 +414,7 @@ bool Histogram::InspectConstructionArguments(const std::string& name,
}
uint64_t Histogram::name_hash() const {
- return samples_->id();
+ return unlogged_samples_->id();
}
HistogramType Histogram::GetHistogramType() const {
@@ -445,7 +445,7 @@ void Histogram::AddCount(int value, int count) {
NOTREACHED();
return;
}
- samples_->Accumulate(value, count);
+ unlogged_samples_->Accumulate(value, count);
FindAndRunCallback(value);
}
@@ -457,17 +457,10 @@ std::unique_ptr<HistogramSamples> Histogram::SnapshotSamples() const {
std::unique_ptr<HistogramSamples> Histogram::SnapshotDelta() {
DCHECK(!final_delta_created_);
- std::unique_ptr<HistogramSamples> snapshot = SnapshotSampleVector();
- if (!logged_samples_) {
- // If nothing has been previously logged, save this one as
- // |logged_samples_| and gather another snapshot to return.
- logged_samples_.swap(snapshot);
- return SnapshotSampleVector();
- }
-
- // Subtract what was previously logged and update that information.
- snapshot->Subtract(*logged_samples_);
+ std::unique_ptr<HistogramSamples> snapshot = SnapshotUnloggedSamples();
+ unlogged_samples_->Subtract(*snapshot);
logged_samples_->Add(*snapshot);
+
return snapshot;
}
@@ -475,20 +468,15 @@ std::unique_ptr<HistogramSamples> Histogram::SnapshotFinalDelta() const {
DCHECK(!final_delta_created_);
final_delta_created_ = true;
- std::unique_ptr<HistogramSamples> snapshot = SnapshotSampleVector();
-
- // Subtract what was previously logged and then return.
- if (logged_samples_)
- snapshot->Subtract(*logged_samples_);
- return snapshot;
+ return SnapshotUnloggedSamples();
}
void Histogram::AddSamples(const HistogramSamples& samples) {
- samples_->Add(samples);
+ unlogged_samples_->Add(samples);
}
bool Histogram::AddSamplesFromPickle(PickleIterator* iter) {
- return samples_->AddFromPickle(iter);
+ return unlogged_samples_->AddFromPickle(iter);
}
// The following methods provide a graphical histogram display.
@@ -521,8 +509,10 @@ Histogram::Histogram(const std::string& name,
bucket_ranges_(ranges),
declared_min_(minimum),
declared_max_(maximum) {
- if (ranges)
- samples_.reset(new SampleVector(HashMetricName(name), ranges));
+ if (ranges) {
+ unlogged_samples_.reset(new SampleVector(HashMetricName(name), ranges));
+ logged_samples_.reset(new SampleVector(unlogged_samples_->id(), ranges));
bcwhite 2017/05/10 12:40:33 Historical Note: This was avoided in the past so a
altimin 2017/05/10 13:08:55 Acknowledged.
+ }
}
Histogram::Histogram(const std::string& name,
@@ -538,10 +528,10 @@ Histogram::Histogram(const std::string& name,
declared_min_(minimum),
declared_max_(maximum) {
if (ranges) {
- samples_.reset(
+ unlogged_samples_.reset(
new PersistentSampleVector(HashMetricName(name), ranges, meta, counts));
logged_samples_.reset(new PersistentSampleVector(
- samples_->id(), ranges, logged_meta, logged_counts));
+ unlogged_samples_->id(), ranges, logged_meta, logged_counts));
}
}
@@ -599,9 +589,15 @@ HistogramBase* Histogram::DeserializeInfoImpl(PickleIterator* iter) {
}
std::unique_ptr<SampleVector> Histogram::SnapshotSampleVector() const {
- std::unique_ptr<SampleVector> samples(
- new SampleVector(samples_->id(), bucket_ranges()));
- samples->Add(*samples_);
+ std::unique_ptr<SampleVector> samples = SnapshotUnloggedSamples();
+ samples->Add(*logged_samples_);
+ return samples;
+}
+
+std::unique_ptr<SampleVector> Histogram::SnapshotUnloggedSamples() const {
+ std::unique_ptr<SampleVector> samples =
+ base::MakeUnique<SampleVector>(unlogged_samples_->id(), bucket_ranges());
+ samples->Add(*unlogged_samples_);
return samples;
}

Powered by Google App Engine
This is Rietveld 408576698