Index: components/metrics/single_sample_metrics_factory_impl.cc |
diff --git a/components/metrics/single_sample_metrics_factory_impl.cc b/components/metrics/single_sample_metrics_factory_impl.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b19581dd6e2473b466297f0bf9064dfa1cefbbcb |
--- /dev/null |
+++ b/components/metrics/single_sample_metrics_factory_impl.cc |
@@ -0,0 +1,82 @@ |
+// 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 "components/metrics/single_sample_metrics_factory_impl.h" |
+ |
+#include "base/threading/thread_checker.h" |
+ |
+namespace metrics { |
+ |
+class SingleSampleMetricImpl : public base::SingleSampleMetric { |
Alexei Svitkine (slow)
2017/05/03 21:18:48
Can this be in the anon namespace?
DaleCurtis
2017/05/03 21:37:51
Done.
|
+ public: |
+ SingleSampleMetricImpl(mojom::SingleSampleMetricPtr metric) |
+ : metric_(std::move(metric)) {} |
+ |
+ ~SingleSampleMetricImpl() override { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ } |
+ |
+ void SetSample(base::HistogramBase::Sample sample) override { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ metric_->SetSample(sample); |
+ } |
+ |
+ private: |
+ base::ThreadChecker thread_checker_; |
+ mojom::SingleSampleMetricPtr metric_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SingleSampleMetricImpl); |
+}; |
+ |
+SingleSampleMetricsFactoryImpl::SingleSampleMetricsFactoryImpl( |
+ CreateProviderCB create_provider_cb) |
+ : create_provider_cb_(std::move(create_provider_cb)) {} |
+ |
+SingleSampleMetricsFactoryImpl::~SingleSampleMetricsFactoryImpl() {} |
+ |
+std::unique_ptr<base::SingleSampleMetric> |
+SingleSampleMetricsFactoryImpl::CreateCustomCountsMetric( |
+ const std::string& histogram_name, |
+ base::HistogramBase::Sample min, |
+ base::HistogramBase::Sample max, |
+ uint32_t bucket_count) { |
+ return CreateMetric(histogram_name, min, max, bucket_count, |
+ base::HistogramBase::kUmaTargetedHistogramFlag); |
+} |
+ |
+void SingleSampleMetricsFactoryImpl::DestroyProviderForTesting() { |
+ if (auto* provider = provider_.Get()) |
+ delete provider; |
+ provider_.Set(nullptr); |
+} |
+ |
+std::unique_ptr<base::SingleSampleMetric> |
+SingleSampleMetricsFactoryImpl::CreateMetric(const std::string& histogram_name, |
+ base::HistogramBase::Sample min, |
+ base::HistogramBase::Sample max, |
+ uint32_t bucket_count, |
+ int32_t flags) { |
+ mojom::SingleSampleMetricPtr metric; |
+ GetProvider()->AcquireSingleSampleMetric( |
+ histogram_name, min, max, bucket_count, flags, |
+ mojo::MakeRequest<mojom::SingleSampleMetric>(&metric)); |
+ return base::MakeUnique<SingleSampleMetricImpl>(std::move(metric)); |
+} |
+ |
+mojom::SingleSampleMetricsProvider* |
+SingleSampleMetricsFactoryImpl::GetProvider() { |
+ if (auto* provider = provider_.Get()) |
+ return provider->get(); |
+ |
+ // Providers persist per-thread until process shutdown. |
+ mojom::SingleSampleMetricsProviderPtr* provider = |
+ new mojom::SingleSampleMetricsProviderPtr(); |
+ provider_.Set(provider); |
Alexei Svitkine (slow)
2017/05/03 21:18:48
That's a lot of indirection. Might be good to call
DaleCurtis
2017/05/03 21:37:51
Comments added.
|
+ |
+ // Create a provider for the current thread. |
+ create_provider_cb_.Run(mojo::MakeRequest(provider)); |
+ return provider->get(); |
+} |
+ |
+} // namespace metrics |