Chromium Code Reviews| Index: base/metrics/persistent_histogram_allocator.cc |
| diff --git a/base/metrics/persistent_histogram_allocator.cc b/base/metrics/persistent_histogram_allocator.cc |
| index 20f64336016ae7acf269c3faa25ba3e8fc585425..ce6d23a232c34cb73dc04df69169f5a7e1ec8754 100644 |
| --- a/base/metrics/persistent_histogram_allocator.cc |
| +++ b/base/metrics/persistent_histogram_allocator.cc |
| @@ -16,6 +16,7 @@ |
| #include "base/metrics/persistent_sample_map.h" |
| #include "base/metrics/sparse_histogram.h" |
| #include "base/metrics/statistics_recorder.h" |
| +#include "base/pickle.h" |
| #include "base/synchronization/lock.h" |
| // TODO(bcwhite): Order these methods to match the header file. The current |
| @@ -483,6 +484,52 @@ void PersistentHistogramAllocator::FinalizeHistogram(Reference ref, |
| memory_allocator_->SetType(ref, 0); |
| } |
| +void PersistentHistogramAllocator::MergeHistogramToStatisticsRecorder( |
|
Alexei Svitkine (slow)
2016/06/01 22:02:15
Can you add unit test coverage for this function?
bcwhite
2016/06/02 19:19:26
Done.
|
| + HistogramBase* histogram) { |
| + // This should never be called on the global histogram allocator as objects |
| + // created there are already within the global statistics recorder. |
|
Alexei Svitkine (slow)
2016/06/01 22:02:15
Please reproduce this comment in the header file c
bcwhite
2016/06/02 19:19:26
Done.
|
| + DCHECK_NE(g_allocator, this); |
| + DCHECK(histogram); |
| + |
| + HistogramBase* existing = |
| + StatisticsRecorder::FindHistogram(histogram->histogram_name()); |
| + if (!existing) { |
| + // Adding the passed histogram to the SR would cause a problem if the |
| + // allocator that holds it eventually goes away. Instead, create a new |
| + // one from a serialized version and then add the data to it. Future |
| + // merges won't need to do this step since FindHistogram() will locate |
| + // the one created here. |
| + base::Pickle pickle; |
| + if (!histogram->SerializeInfo(&pickle)) { |
| + // Pickling should never fail but if it does, no real harm is done. |
| + // The data won't be merged but it also won't be recorded as merged |
| + // so a future try, if successful, will get what was missed. If it |
| + // continues to fail, some metric data will be lost but that is |
| + // better than crashing. |
| + NOTREACHED(); |
| + return; |
| + } |
| + |
| + PickleIterator iter(pickle); |
| + existing = DeserializeHistogramInfo(&iter); |
| + if (!existing) { |
| + // Un-pickling should similarly never fail. |
| + NOTREACHED(); |
| + return; |
| + } |
| + |
| + // Make sure there is no "serialization" flag set. |
| + DCHECK_EQ(0, |
| + existing->flags() & HistogramBase::kIPCSerializationSourceFlag); |
| + |
| + // Record the newly created histogram in the SR. |
| + existing = StatisticsRecorder::RegisterOrDeleteDuplicate(existing); |
| + } |
| + |
| + // Merge the delta from the passed object to the one in the SR. |
| + existing->AddSamples(*histogram->SnapshotDelta()); |
| +} |
| + |
| PersistentSampleMapRecords* PersistentHistogramAllocator::UseSampleMapRecords( |
| uint64_t id, |
| const void* user) { |