summaryrefslogtreecommitdiff
path: root/chromium/net/disk_cache/stats_histogram.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/disk_cache/stats_histogram.cc')
-rw-r--r--chromium/net/disk_cache/stats_histogram.cc89
1 files changed, 89 insertions, 0 deletions
diff --git a/chromium/net/disk_cache/stats_histogram.cc b/chromium/net/disk_cache/stats_histogram.cc
new file mode 100644
index 00000000000..33adfeaae49
--- /dev/null
+++ b/chromium/net/disk_cache/stats_histogram.cc
@@ -0,0 +1,89 @@
+// 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,
+ const BucketRanges* ranges,
+ const Stats* stats)
+ : Histogram(name, minimum, maximum, 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;
+ HistogramBase* 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, 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>();
+}
+
+int StatsHistogram::FindCorruption(const HistogramSamples& samples) const {
+ // This class won't monitor inconsistencies.
+ return HistogramBase::NO_INCONSISTENCIES;
+}
+
+} // namespace disk_cache