// 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 { namespace { class SingleSampleMetricImpl : public base::SingleSampleMetric { 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); }; } // namespace SingleSampleMetricsFactoryImpl::SingleSampleMetricsFactoryImpl( CreateProviderCB create_provider_cb) : create_provider_cb_(std::move(create_provider_cb)) {} SingleSampleMetricsFactoryImpl::~SingleSampleMetricsFactoryImpl() {} std::unique_ptr 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_tls_.Get()) delete provider; provider_tls_.Set(nullptr); } std::unique_ptr 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(&metric)); return base::MakeUnique(std::move(metric)); } mojom::SingleSampleMetricsProvider* SingleSampleMetricsFactoryImpl::GetProvider() { // Check the current TLS slot to see if we have created a provider already for // this thread. if (auto* provider = provider_tls_.Get()) return provider->get(); // If not, create a new one which will persist until process shutdown and put // it in the TLS slot for the current thread. mojom::SingleSampleMetricsProviderPtr* provider = new mojom::SingleSampleMetricsProviderPtr(); provider_tls_.Set(provider); // Start the provider connection and return it; it won't be fully connected // until later, but mojo will buffer all calls prior to completion. create_provider_cb_.Run(mojo::MakeRequest(provider)); return provider->get(); } } // namespace metrics