1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "components/metrics/single_sample_metrics.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <memory>
8*6777b538SAndroid Build Coastguard Worker #include <utility>
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker #include "base/metrics/single_sample_metrics.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread_checker.h"
12*6777b538SAndroid Build Coastguard Worker #include "components/metrics/single_sample_metrics_factory_impl.h"
13*6777b538SAndroid Build Coastguard Worker #include "mojo/public/cpp/bindings/pending_receiver.h"
14*6777b538SAndroid Build Coastguard Worker #include "mojo/public/cpp/bindings/self_owned_receiver.h"
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Worker namespace metrics {
17*6777b538SAndroid Build Coastguard Worker namespace {
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Worker class MojoSingleSampleMetric : public mojom::SingleSampleMetric {
20*6777b538SAndroid Build Coastguard Worker public:
MojoSingleSampleMetric(const std::string & histogram_name,base::HistogramBase::Sample min,base::HistogramBase::Sample max,uint32_t bucket_count,int32_t flags)21*6777b538SAndroid Build Coastguard Worker MojoSingleSampleMetric(const std::string& histogram_name,
22*6777b538SAndroid Build Coastguard Worker base::HistogramBase::Sample min,
23*6777b538SAndroid Build Coastguard Worker base::HistogramBase::Sample max,
24*6777b538SAndroid Build Coastguard Worker uint32_t bucket_count,
25*6777b538SAndroid Build Coastguard Worker int32_t flags)
26*6777b538SAndroid Build Coastguard Worker : metric_(histogram_name, min, max, bucket_count, flags) {}
27*6777b538SAndroid Build Coastguard Worker
28*6777b538SAndroid Build Coastguard Worker MojoSingleSampleMetric(const MojoSingleSampleMetric&) = delete;
29*6777b538SAndroid Build Coastguard Worker MojoSingleSampleMetric& operator=(const MojoSingleSampleMetric&) = delete;
30*6777b538SAndroid Build Coastguard Worker
~MojoSingleSampleMetric()31*6777b538SAndroid Build Coastguard Worker ~MojoSingleSampleMetric() override {}
32*6777b538SAndroid Build Coastguard Worker
33*6777b538SAndroid Build Coastguard Worker private:
34*6777b538SAndroid Build Coastguard Worker // mojom::SingleSampleMetric:
SetSample(base::HistogramBase::Sample sample)35*6777b538SAndroid Build Coastguard Worker void SetSample(base::HistogramBase::Sample sample) override {
36*6777b538SAndroid Build Coastguard Worker metric_.SetSample(sample);
37*6777b538SAndroid Build Coastguard Worker }
38*6777b538SAndroid Build Coastguard Worker
39*6777b538SAndroid Build Coastguard Worker base::DefaultSingleSampleMetric metric_;
40*6777b538SAndroid Build Coastguard Worker };
41*6777b538SAndroid Build Coastguard Worker
42*6777b538SAndroid Build Coastguard Worker class MojoSingleSampleMetricsProvider
43*6777b538SAndroid Build Coastguard Worker : public mojom::SingleSampleMetricsProvider {
44*6777b538SAndroid Build Coastguard Worker public:
MojoSingleSampleMetricsProvider()45*6777b538SAndroid Build Coastguard Worker MojoSingleSampleMetricsProvider() {}
46*6777b538SAndroid Build Coastguard Worker
47*6777b538SAndroid Build Coastguard Worker MojoSingleSampleMetricsProvider(const MojoSingleSampleMetricsProvider&) =
48*6777b538SAndroid Build Coastguard Worker delete;
49*6777b538SAndroid Build Coastguard Worker MojoSingleSampleMetricsProvider& operator=(
50*6777b538SAndroid Build Coastguard Worker const MojoSingleSampleMetricsProvider&) = delete;
51*6777b538SAndroid Build Coastguard Worker
~MojoSingleSampleMetricsProvider()52*6777b538SAndroid Build Coastguard Worker ~MojoSingleSampleMetricsProvider() override {
53*6777b538SAndroid Build Coastguard Worker DCHECK(thread_checker_.CalledOnValidThread());
54*6777b538SAndroid Build Coastguard Worker }
55*6777b538SAndroid Build Coastguard Worker
56*6777b538SAndroid Build Coastguard Worker private:
57*6777b538SAndroid Build Coastguard Worker // mojom::SingleSampleMetricsProvider:
AcquireSingleSampleMetric(const std::string & histogram_name,base::HistogramBase::Sample min,base::HistogramBase::Sample max,uint32_t bucket_count,int32_t flags,mojo::PendingReceiver<mojom::SingleSampleMetric> receiver)58*6777b538SAndroid Build Coastguard Worker void AcquireSingleSampleMetric(
59*6777b538SAndroid Build Coastguard Worker const std::string& histogram_name,
60*6777b538SAndroid Build Coastguard Worker base::HistogramBase::Sample min,
61*6777b538SAndroid Build Coastguard Worker base::HistogramBase::Sample max,
62*6777b538SAndroid Build Coastguard Worker uint32_t bucket_count,
63*6777b538SAndroid Build Coastguard Worker int32_t flags,
64*6777b538SAndroid Build Coastguard Worker mojo::PendingReceiver<mojom::SingleSampleMetric> receiver) override {
65*6777b538SAndroid Build Coastguard Worker DCHECK(thread_checker_.CalledOnValidThread());
66*6777b538SAndroid Build Coastguard Worker mojo::MakeSelfOwnedReceiver(
67*6777b538SAndroid Build Coastguard Worker std::make_unique<MojoSingleSampleMetric>(histogram_name, min, max,
68*6777b538SAndroid Build Coastguard Worker bucket_count, flags),
69*6777b538SAndroid Build Coastguard Worker std::move(receiver));
70*6777b538SAndroid Build Coastguard Worker }
71*6777b538SAndroid Build Coastguard Worker
72*6777b538SAndroid Build Coastguard Worker // Providers must be created, used on, and destroyed on the same thread.
73*6777b538SAndroid Build Coastguard Worker base::ThreadChecker thread_checker_;
74*6777b538SAndroid Build Coastguard Worker };
75*6777b538SAndroid Build Coastguard Worker
76*6777b538SAndroid Build Coastguard Worker } // namespace
77*6777b538SAndroid Build Coastguard Worker
78*6777b538SAndroid Build Coastguard Worker // static
InitializeSingleSampleMetricsFactory(CreateProviderCB create_provider_cb)79*6777b538SAndroid Build Coastguard Worker void InitializeSingleSampleMetricsFactory(CreateProviderCB create_provider_cb) {
80*6777b538SAndroid Build Coastguard Worker base::SingleSampleMetricsFactory::SetFactory(
81*6777b538SAndroid Build Coastguard Worker std::make_unique<SingleSampleMetricsFactoryImpl>(
82*6777b538SAndroid Build Coastguard Worker std::move(create_provider_cb)));
83*6777b538SAndroid Build Coastguard Worker }
84*6777b538SAndroid Build Coastguard Worker
85*6777b538SAndroid Build Coastguard Worker // static
CreateSingleSampleMetricsProvider(mojo::PendingReceiver<mojom::SingleSampleMetricsProvider> receiver)86*6777b538SAndroid Build Coastguard Worker void CreateSingleSampleMetricsProvider(
87*6777b538SAndroid Build Coastguard Worker mojo::PendingReceiver<mojom::SingleSampleMetricsProvider> receiver) {
88*6777b538SAndroid Build Coastguard Worker mojo::MakeSelfOwnedReceiver(
89*6777b538SAndroid Build Coastguard Worker std::make_unique<MojoSingleSampleMetricsProvider>(), std::move(receiver));
90*6777b538SAndroid Build Coastguard Worker }
91*6777b538SAndroid Build Coastguard Worker
92*6777b538SAndroid Build Coastguard Worker } // namespace metrics
93