78 lines
2.2 KiB
C++
78 lines
2.2 KiB
C++
|
// Copyright 2017 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 "base/metrics/single_sample_metrics.h"
|
||
|
|
||
|
#include "base/memory/ptr_util.h"
|
||
|
#include "base/metrics/histogram.h"
|
||
|
|
||
|
namespace base {
|
||
|
|
||
|
static SingleSampleMetricsFactory* g_factory = nullptr;
|
||
|
|
||
|
// static
|
||
|
SingleSampleMetricsFactory* SingleSampleMetricsFactory::Get() {
|
||
|
if (!g_factory)
|
||
|
g_factory = new DefaultSingleSampleMetricsFactory();
|
||
|
|
||
|
return g_factory;
|
||
|
}
|
||
|
|
||
|
// static
|
||
|
void SingleSampleMetricsFactory::SetFactory(
|
||
|
std::unique_ptr<SingleSampleMetricsFactory> factory) {
|
||
|
DCHECK(!g_factory);
|
||
|
g_factory = factory.release();
|
||
|
}
|
||
|
|
||
|
// static
|
||
|
void SingleSampleMetricsFactory::DeleteFactoryForTesting() {
|
||
|
DCHECK(g_factory);
|
||
|
delete g_factory;
|
||
|
g_factory = nullptr;
|
||
|
}
|
||
|
|
||
|
std::unique_ptr<SingleSampleMetric>
|
||
|
DefaultSingleSampleMetricsFactory::CreateCustomCountsMetric(
|
||
|
const std::string& histogram_name,
|
||
|
HistogramBase::Sample min,
|
||
|
HistogramBase::Sample max,
|
||
|
uint32_t bucket_count) {
|
||
|
return std::make_unique<DefaultSingleSampleMetric>(
|
||
|
histogram_name, min, max, bucket_count,
|
||
|
HistogramBase::kUmaTargetedHistogramFlag);
|
||
|
}
|
||
|
|
||
|
DefaultSingleSampleMetric::DefaultSingleSampleMetric(
|
||
|
const std::string& histogram_name,
|
||
|
HistogramBase::Sample min,
|
||
|
HistogramBase::Sample max,
|
||
|
uint32_t bucket_count,
|
||
|
int32_t flags)
|
||
|
: histogram_(Histogram::FactoryGet(histogram_name,
|
||
|
min,
|
||
|
max,
|
||
|
bucket_count,
|
||
|
flags)) {
|
||
|
// Bad construction parameters may lead to |histogram_| being null; DCHECK to
|
||
|
// find accidental errors in production. We must still handle the nullptr in
|
||
|
// destruction though since this construction may come from another untrusted
|
||
|
// process.
|
||
|
DCHECK(histogram_);
|
||
|
}
|
||
|
|
||
|
DefaultSingleSampleMetric::~DefaultSingleSampleMetric() {
|
||
|
// |histogram_| may be nullptr if bad construction parameters are given.
|
||
|
if (sample_ < 0 || !histogram_)
|
||
|
return;
|
||
|
histogram_->Add(sample_);
|
||
|
}
|
||
|
|
||
|
void DefaultSingleSampleMetric::SetSample(HistogramBase::Sample sample) {
|
||
|
DCHECK_GE(sample, 0);
|
||
|
sample_ = sample;
|
||
|
}
|
||
|
|
||
|
} // namespace base
|