| Index: base/metrics/persistent_histogram_allocator.cc
|
| diff --git a/base/metrics/persistent_histogram_allocator.cc b/base/metrics/persistent_histogram_allocator.cc
|
| index 730116e46fbbce98db4101a10535d29f5674c7c7..864753bab5d3413c46252320657b0d1d4b5e79cd 100644
|
| --- a/base/metrics/persistent_histogram_allocator.cc
|
| +++ b/base/metrics/persistent_histogram_allocator.cc
|
| @@ -111,16 +111,26 @@ struct PersistentHistogramAllocator::PersistentHistogramData {
|
| char name[1];
|
| };
|
|
|
| +PersistentHistogramAllocator::Iterator::Iterator(
|
| + PersistentHistogramAllocator* allocator)
|
| + : allocator_(allocator), memory_iter_(allocator->memory_allocator()) {}
|
| +
|
| +std::unique_ptr<HistogramBase>
|
| +PersistentHistogramAllocator::Iterator::GetNextWithIgnore(Reference ignore) {
|
| + PersistentMemoryAllocator::Reference ref;
|
| + while ((ref = memory_iter_.GetNextOfType(kTypeIdHistogram)) != 0) {
|
| + if (ref != ignore)
|
| + return allocator_->GetHistogram(ref);
|
| + }
|
| + return nullptr;
|
| +}
|
| +
|
| PersistentHistogramAllocator::PersistentHistogramAllocator(
|
| std::unique_ptr<PersistentMemoryAllocator> memory)
|
| : memory_allocator_(std::move(memory)) {}
|
|
|
| PersistentHistogramAllocator::~PersistentHistogramAllocator() {}
|
|
|
| -void PersistentHistogramAllocator::CreateIterator(Iterator* iter) {
|
| - memory_allocator_->CreateIterator(&iter->memory_iter);
|
| -}
|
| -
|
| void PersistentHistogramAllocator::CreateTrackingHistograms(StringPiece name) {
|
| memory_allocator_->CreateTrackingHistograms(name);
|
| }
|
| @@ -320,21 +330,6 @@ std::unique_ptr<HistogramBase> PersistentHistogramAllocator::GetHistogram(
|
| return CreateHistogram(histogram_data);
|
| }
|
|
|
| -std::unique_ptr<HistogramBase>
|
| -PersistentHistogramAllocator::GetNextHistogramWithIgnore(Iterator* iter,
|
| - Reference ignore) {
|
| - PersistentMemoryAllocator::Reference ref;
|
| - uint32_t type_id;
|
| - while ((ref = memory_allocator_->GetNextIterable(&iter->memory_iter,
|
| - &type_id)) != 0) {
|
| - if (ref == ignore)
|
| - continue;
|
| - if (type_id == kTypeIdHistogram)
|
| - return GetHistogram(ref);
|
| - }
|
| - return nullptr;
|
| -}
|
| -
|
| void PersistentHistogramAllocator::FinalizeHistogram(Reference ref,
|
| bool registered) {
|
| // If the created persistent histogram was registered then it needs to
|
| @@ -543,27 +538,23 @@ GlobalHistogramAllocator::ReleaseForTesting() {
|
| // Before releasing the memory, it's necessary to have the Statistics-
|
| // Recorder forget about the histograms contained therein; otherwise,
|
| // some operations will try to access them and the released memory.
|
| - PersistentMemoryAllocator::Iterator iter;
|
| + PersistentMemoryAllocator::Iterator iter(memory_allocator);
|
| PersistentMemoryAllocator::Reference ref;
|
| - uint32_t type_id;
|
| - memory_allocator->CreateIterator(&iter);
|
| - while ((ref = memory_allocator->GetNextIterable(&iter, &type_id)) != 0) {
|
| - if (type_id == kTypeIdHistogram) {
|
| - PersistentHistogramData* histogram_data =
|
| - memory_allocator->GetAsObject<PersistentHistogramData>(
|
| - ref, kTypeIdHistogram);
|
| - DCHECK(histogram_data);
|
| - StatisticsRecorder::ForgetHistogramForTesting(histogram_data->name);
|
| -
|
| - // If a test breaks here then a memory region containing a histogram
|
| - // actively used by this code is being released back to the test.
|
| - // If that memory segment were to be deleted, future calls to create
|
| - // persistent histograms would crash. To avoid this, have the test call
|
| - // the method GetCreateHistogramResultHistogram() *before* setting
|
| - // the (temporary) memory allocator via SetGlobalAllocator() so that
|
| - // histogram is instead allocated from the process heap.
|
| - DCHECK_NE(kResultHistogram, histogram_data->name);
|
| - }
|
| + while ((ref = iter.GetNextOfType(kTypeIdHistogram)) != 0) {
|
| + PersistentHistogramData* histogram_data =
|
| + memory_allocator->GetAsObject<PersistentHistogramData>(
|
| + ref, kTypeIdHistogram);
|
| + DCHECK(histogram_data);
|
| + StatisticsRecorder::ForgetHistogramForTesting(histogram_data->name);
|
| +
|
| + // If a test breaks here then a memory region containing a histogram
|
| + // actively used by this code is being released back to the test.
|
| + // If that memory segment were to be deleted, future calls to create
|
| + // persistent histograms would crash. To avoid this, have the test call
|
| + // the method GetCreateHistogramResultHistogram() *before* setting
|
| + // the (temporary) memory allocator via SetGlobalAllocator() so that
|
| + // histogram is instead allocated from the process heap.
|
| + DCHECK_NE(kResultHistogram, histogram_data->name);
|
| }
|
|
|
| g_allocator = nullptr;
|
| @@ -572,9 +563,8 @@ GlobalHistogramAllocator::ReleaseForTesting() {
|
|
|
| GlobalHistogramAllocator::GlobalHistogramAllocator(
|
| std::unique_ptr<PersistentMemoryAllocator> memory)
|
| - : PersistentHistogramAllocator(std::move(memory)) {
|
| - CreateIterator(&import_iterator_);
|
| -}
|
| + : PersistentHistogramAllocator(std::move(memory)),
|
| + import_iterator_(this) {}
|
|
|
| void GlobalHistogramAllocator::ImportHistogramsToStatisticsRecorder() {
|
| // Skip the import if it's the histogram that was last created. Should a
|
| @@ -589,7 +579,7 @@ void GlobalHistogramAllocator::ImportHistogramsToStatisticsRecorder() {
|
| // the StatisticsRecorder which has its own lock.
|
| while (true) {
|
| std::unique_ptr<HistogramBase> histogram =
|
| - GetNextHistogramWithIgnore(&import_iterator_, record_to_ignore);
|
| + import_iterator_.GetNextWithIgnore(record_to_ignore);
|
| if (!histogram)
|
| break;
|
| StatisticsRecorder::RegisterOrDeleteDuplicate(histogram.release());
|
|
|