| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "net/disk_cache/stats_histogram.h" | |
| #include "base/debug/leak_annotations.h" | |
| #include "base/logging.h" | |
| #include "base/metrics/bucket_ranges.h" | |
| #include "base/metrics/histogram_base.h" | |
| #include "base/metrics/sample_vector.h" | |
| #include "base/metrics/statistics_recorder.h" | |
| #include "net/disk_cache/stats.h" | |
| namespace disk_cache { | |
| using base::BucketRanges; | |
| using base::Histogram; | |
| using base::HistogramSamples; | |
| using base::SampleVector; | |
| using base::StatisticsRecorder; | |
| StatsHistogram::StatsHistogram(const std::string& name, | |
| Sample minimum, | |
| Sample maximum, | |
| size_t bucket_count, | |
| const BucketRanges* ranges, | |
| const Stats* stats) | |
| : Histogram(name, minimum, maximum, bucket_count, ranges), | |
| stats_(stats) {} | |
| StatsHistogram::~StatsHistogram() {} | |
| // static | |
| void StatsHistogram::InitializeBucketRanges(const Stats* stats, | |
| BucketRanges* ranges) { | |
| for (size_t i = 0; i < ranges->size(); i++) { | |
| ranges->set_range(i, stats->GetBucketRange(i)); | |
| } | |
| ranges->ResetChecksum(); | |
| } | |
| StatsHistogram* StatsHistogram::FactoryGet(const std::string& name, | |
| const Stats* stats) { | |
| Sample minimum = 1; | |
| Sample maximum = disk_cache::Stats::kDataSizesLength - 1; | |
| size_t bucket_count = disk_cache::Stats::kDataSizesLength; | |
| Histogram* histogram = StatisticsRecorder::FindHistogram(name); | |
| if (!histogram) { | |
| DCHECK(stats); | |
| // To avoid racy destruction at shutdown, the following will be leaked. | |
| BucketRanges* ranges = new BucketRanges(bucket_count + 1); | |
| InitializeBucketRanges(stats, ranges); | |
| const BucketRanges* registered_ranges = | |
| StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges); | |
| // To avoid racy destruction at shutdown, the following will be leaked. | |
| StatsHistogram* stats_histogram = | |
| new StatsHistogram(name, minimum, maximum, bucket_count, | |
| registered_ranges, stats); | |
| stats_histogram->SetFlags(kUmaTargetedHistogramFlag); | |
| histogram = StatisticsRecorder::RegisterOrDeleteDuplicate(stats_histogram); | |
| } | |
| DCHECK(base::HISTOGRAM == histogram->GetHistogramType()); | |
| DCHECK(histogram->HasConstructionArguments(minimum, maximum, bucket_count)); | |
| // We're preparing for an otherwise unsafe upcast by ensuring we have the | |
| // proper class type. | |
| StatsHistogram* return_histogram = static_cast<StatsHistogram*>(histogram); | |
| return return_histogram; | |
| } | |
| scoped_ptr<HistogramSamples> StatsHistogram::SnapshotSamples() const { | |
| scoped_ptr<SampleVector> samples(new SampleVector(bucket_ranges())); | |
| stats_->Snapshot(samples.get()); | |
| // Only report UMA data once. | |
| StatsHistogram* mutable_me = const_cast<StatsHistogram*>(this); | |
| mutable_me->ClearFlags(kUmaTargetedHistogramFlag); | |
| return samples.PassAs<HistogramSamples>(); | |
| } | |
| Histogram::Inconsistencies StatsHistogram::FindCorruption( | |
| const HistogramSamples& samples) const { | |
| return NO_INCONSISTENCIES; // This class won't monitor inconsistencies. | |
| } | |
| } // namespace disk_cache |