| Index: base/metrics/histogram.cc
|
| diff --git a/base/metrics/histogram.cc b/base/metrics/histogram.cc
|
| index ea4f8167fa28cc7098ce233cddbd7ed77fd23a77..e8d851bf9de3ae3c2831a72d976ec9bd32b6beb5 100644
|
| --- a/base/metrics/histogram.cc
|
| +++ b/base/metrics/histogram.cc
|
| @@ -19,8 +19,8 @@
|
| #include "base/debug/alias.h"
|
| #include "base/logging.h"
|
| #include "base/metrics/histogram_macros.h"
|
| -#include "base/metrics/histogram_persistence.h"
|
| #include "base/metrics/metrics_hashes.h"
|
| +#include "base/metrics/persistent_histogram_allocator.h"
|
| #include "base/metrics/persistent_memory_allocator.h"
|
| #include "base/metrics/sample_vector.h"
|
| #include "base/metrics/statistics_recorder.h"
|
| @@ -122,8 +122,8 @@ class Histogram::Factory {
|
|
|
| // Allocate the correct Histogram object off the heap (in case persistent
|
| // memory is not available).
|
| - virtual HistogramBase* HeapAlloc(const BucketRanges* ranges) {
|
| - return new Histogram(name_, minimum_, maximum_, ranges);
|
| + virtual scoped_ptr<HistogramBase> HeapAlloc(const BucketRanges* ranges) {
|
| + return make_scoped_ptr(new Histogram(name_, minimum_, maximum_, ranges));
|
| }
|
|
|
| // Perform any required datafill on the just-created histogram. If
|
| @@ -151,7 +151,7 @@ HistogramBase* Histogram::Factory::Build() {
|
| // been added by other processes and they must be fetched and recognized
|
| // locally in order to be found by FindHistograms() below. If the persistent
|
| // memory segment is not shared between processes, this call does nothing.
|
| - ImportPersistentHistograms();
|
| + PersistentHistogramAllocator::ImportGlobalHistograms();
|
|
|
| HistogramBase* histogram = StatisticsRecorder::FindHistogram(name_);
|
| if (!histogram) {
|
| @@ -176,14 +176,13 @@ HistogramBase* Histogram::Factory::Build() {
|
| // that is off by default. If the allocator doesn't exist or if
|
| // allocating from it fails, code below will allocate the histogram from
|
| // the process heap.
|
| - PersistentMemoryAllocator::Reference histogram_ref = 0;
|
| - HistogramBase* tentative_histogram = nullptr;
|
| - PersistentMemoryAllocator* allocator =
|
| - GetPersistentHistogramMemoryAllocator();
|
| + PersistentHistogramAllocator::Reference histogram_ref = 0;
|
| + scoped_ptr<HistogramBase> tentative_histogram;
|
| + PersistentHistogramAllocator* allocator =
|
| + PersistentHistogramAllocator::GetGlobalAllocator();
|
| if (allocator) {
|
| flags_ |= HistogramBase::kIsPersistent;
|
| - tentative_histogram = AllocatePersistentHistogram(
|
| - allocator,
|
| + tentative_histogram = allocator->AllocateHistogram(
|
| histogram_type_,
|
| name_,
|
| minimum_,
|
| @@ -202,14 +201,20 @@ HistogramBase* Histogram::Factory::Build() {
|
| tentative_histogram = HeapAlloc(registered_ranges);
|
| }
|
|
|
| - FillHistogram(tentative_histogram);
|
| - histogram =
|
| - StatisticsRecorder::RegisterOrDeleteDuplicate(tentative_histogram);
|
| + FillHistogram(tentative_histogram.get());
|
| +
|
| + // Register this histogram with the StatisticsRecorder. Keep a copy of
|
| + // the pointer value to tell later whether the locally created histogram
|
| + // was registered or deleted. The type is "void" because it could point
|
| + // to released memory after the following line.
|
| + const void* tentative_histogram_ptr = tentative_histogram.get();
|
| + histogram = StatisticsRecorder::RegisterOrDeleteDuplicate(
|
| + tentative_histogram.release());
|
|
|
| // Persistent histograms need some follow-up processing.
|
| if (histogram_ref) {
|
| - FinalizePersistentHistogram(histogram_ref,
|
| - histogram == tentative_histogram);
|
| + allocator->FinalizeHistogram(histogram_ref,
|
| + histogram == tentative_histogram_ptr);
|
| }
|
| }
|
|
|
| @@ -267,7 +272,7 @@ HistogramBase* Histogram::FactoryTimeGet(const char* name,
|
| flags);
|
| }
|
|
|
| -HistogramBase* Histogram::PersistentGet(
|
| +scoped_ptr<HistogramBase> Histogram::PersistentCreate(
|
| const std::string& name,
|
| Sample minimum,
|
| Sample maximum,
|
| @@ -277,8 +282,9 @@ HistogramBase* Histogram::PersistentGet(
|
| uint32_t counts_size,
|
| HistogramSamples::Metadata* meta,
|
| HistogramSamples::Metadata* logged_meta) {
|
| - return new Histogram(name, minimum, maximum, ranges, counts, logged_counts,
|
| - counts_size, meta, logged_meta);
|
| + return make_scoped_ptr(new Histogram(
|
| + name, minimum, maximum, ranges, counts, logged_counts, counts_size,
|
| + meta, logged_meta));
|
| }
|
|
|
| // Calculate what range of values are held in each bucket.
|
| @@ -732,8 +738,9 @@ class LinearHistogram::Factory : public Histogram::Factory {
|
| return ranges;
|
| }
|
|
|
| - HistogramBase* HeapAlloc(const BucketRanges* ranges) override {
|
| - return new LinearHistogram(name_, minimum_, maximum_, ranges);
|
| + scoped_ptr<HistogramBase> HeapAlloc(const BucketRanges* ranges) override {
|
| + return make_scoped_ptr(
|
| + new LinearHistogram(name_, minimum_, maximum_, ranges));
|
| }
|
|
|
| void FillHistogram(HistogramBase* base_histogram) override {
|
| @@ -792,7 +799,7 @@ HistogramBase* LinearHistogram::FactoryTimeGet(const char* name,
|
| flags);
|
| }
|
|
|
| -HistogramBase* LinearHistogram::PersistentGet(
|
| +scoped_ptr<HistogramBase> LinearHistogram::PersistentCreate(
|
| const std::string& name,
|
| Sample minimum,
|
| Sample maximum,
|
| @@ -802,8 +809,9 @@ HistogramBase* LinearHistogram::PersistentGet(
|
| uint32_t counts_size,
|
| HistogramSamples::Metadata* meta,
|
| HistogramSamples::Metadata* logged_meta) {
|
| - return new LinearHistogram(name, minimum, maximum, ranges, counts,
|
| - logged_counts, counts_size, meta, logged_meta);
|
| + return make_scoped_ptr(new LinearHistogram(
|
| + name, minimum, maximum, ranges, counts, logged_counts, counts_size,
|
| + meta, logged_meta));
|
| }
|
|
|
| HistogramBase* LinearHistogram::FactoryGetWithRangeDescription(
|
| @@ -921,8 +929,8 @@ class BooleanHistogram::Factory : public Histogram::Factory {
|
| return ranges;
|
| }
|
|
|
| - HistogramBase* HeapAlloc(const BucketRanges* ranges) override {
|
| - return new BooleanHistogram(name_, ranges);
|
| + scoped_ptr<HistogramBase> HeapAlloc(const BucketRanges* ranges) override {
|
| + return make_scoped_ptr(new BooleanHistogram(name_, ranges));
|
| }
|
|
|
| private:
|
| @@ -938,15 +946,15 @@ HistogramBase* BooleanHistogram::FactoryGet(const char* name, int32_t flags) {
|
| return FactoryGet(std::string(name), flags);
|
| }
|
|
|
| -HistogramBase* BooleanHistogram::PersistentGet(
|
| +scoped_ptr<HistogramBase> BooleanHistogram::PersistentCreate(
|
| const std::string& name,
|
| const BucketRanges* ranges,
|
| HistogramBase::AtomicCount* counts,
|
| HistogramBase::AtomicCount* logged_counts,
|
| HistogramSamples::Metadata* meta,
|
| HistogramSamples::Metadata* logged_meta) {
|
| - return new BooleanHistogram(name, ranges, counts, logged_counts, meta,
|
| - logged_meta);
|
| + return make_scoped_ptr(new BooleanHistogram(
|
| + name, ranges, counts, logged_counts, meta, logged_meta));
|
| }
|
|
|
| HistogramType BooleanHistogram::GetHistogramType() const {
|
| @@ -1018,8 +1026,8 @@ class CustomHistogram::Factory : public Histogram::Factory {
|
| return bucket_ranges;
|
| }
|
|
|
| - HistogramBase* HeapAlloc(const BucketRanges* ranges) override {
|
| - return new CustomHistogram(name_, ranges);
|
| + scoped_ptr<HistogramBase> HeapAlloc(const BucketRanges* ranges) override {
|
| + return make_scoped_ptr(new CustomHistogram(name_, ranges));
|
| }
|
|
|
| private:
|
| @@ -1044,7 +1052,7 @@ HistogramBase* CustomHistogram::FactoryGet(
|
| return FactoryGet(std::string(name), custom_ranges, flags);
|
| }
|
|
|
| -HistogramBase* CustomHistogram::PersistentGet(
|
| +scoped_ptr<HistogramBase> CustomHistogram::PersistentCreate(
|
| const std::string& name,
|
| const BucketRanges* ranges,
|
| HistogramBase::AtomicCount* counts,
|
| @@ -1052,8 +1060,8 @@ HistogramBase* CustomHistogram::PersistentGet(
|
| uint32_t counts_size,
|
| HistogramSamples::Metadata* meta,
|
| HistogramSamples::Metadata* logged_meta) {
|
| - return new CustomHistogram(name, ranges, counts, logged_counts, counts_size,
|
| - meta, logged_meta);
|
| + return make_scoped_ptr(new CustomHistogram(
|
| + name, ranges, counts, logged_counts, counts_size, meta, logged_meta));
|
| }
|
|
|
| HistogramType CustomHistogram::GetHistogramType() const {
|
|
|