| // 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. | 
 |  | 
 | #ifndef COMPONENTS_METRICS_SINGLE_VALUE_HISTOGRAM_FACTORY_IMPL_H_ | 
 | #define COMPONENTS_METRICS_SINGLE_VALUE_HISTOGRAM_FACTORY_IMPL_H_ | 
 |  | 
 | #include <string> | 
 |  | 
 | #include "base/metrics/single_sample_metrics.h" | 
 | #include "base/threading/thread_local.h" | 
 | #include "components/metrics/public/interfaces/single_sample_metrics.mojom.h" | 
 | #include "components/metrics/single_sample_metrics.h" | 
 |  | 
 | namespace metrics { | 
 |  | 
 | // SingleSampleMetricsFactory implementation for creating SingleSampleMetric | 
 | // instances that communicate over mojo to instances in another process. | 
 | // | 
 | // Persistance outside of the current process allows these metrics to record a | 
 | // sample even in the event of sudden process termination. As an example, this | 
 | // is useful for garbage collected objects which may never get a chance to run | 
 | // their destructors in the event of a fast shutdown event (process kill). | 
 | class SingleSampleMetricsFactoryImpl : public base::SingleSampleMetricsFactory { | 
 |  public: | 
 |   // Constructs a factory capable of vending single sample metrics from any | 
 |   // thread. |create_provider_cb| will be called from arbitrary threads to | 
 |   // create providers as necessary; the callback must handle thread safety. | 
 |   // | 
 |   // We use a callback here to avoid taking additional DEPS on content and a | 
 |   // service_manager::Connector() for simplicitly and to avoid the need for | 
 |   // using the service test harness just for instantiating this class. | 
 |   explicit SingleSampleMetricsFactoryImpl(CreateProviderCB create_provider_cb); | 
 |   ~SingleSampleMetricsFactoryImpl() override; | 
 |  | 
 |   // base::SingleSampleMetricsFactory: | 
 |   std::unique_ptr<base::SingleSampleMetric> CreateCustomCountsMetric( | 
 |       const std::string& histogram_name, | 
 |       base::HistogramBase::Sample min, | 
 |       base::HistogramBase::Sample max, | 
 |       uint32_t bucket_count) override; | 
 |  | 
 |   // Providers live forever in production, but tests should be kind and clean up | 
 |   // after themselves to avoid tests trampling on one another. Destroys the | 
 |   // provider in the TLS slot for the calling thread. | 
 |   void DestroyProviderForTesting(); | 
 |  | 
 |  private: | 
 |   // Creates a single sample metric. | 
 |   std::unique_ptr<base::SingleSampleMetric> CreateMetric( | 
 |       const std::string& histogram_name, | 
 |       base::HistogramBase::Sample min, | 
 |       base::HistogramBase::Sample max, | 
 |       uint32_t bucket_count, | 
 |       int32_t flags); | 
 |  | 
 |   // Gets the SingleSampleMetricsProvider for the current thread. If none | 
 |   // exists, then a new instance is created and set in the TLS slot. | 
 |   mojom::SingleSampleMetricsProvider* GetProvider(); | 
 |  | 
 |   CreateProviderCB create_provider_cb_; | 
 |  | 
 |   // Per thread storage slot for the mojo provider. | 
 |   base::ThreadLocalPointer<mojom::SingleSampleMetricsProviderPtr> provider_tls_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(SingleSampleMetricsFactoryImpl); | 
 | }; | 
 |  | 
 | }  // namespace metrics | 
 |  | 
 | #endif  // COMPONENTS_METRICS_SINGLE_VALUE_HISTOGRAM_FACTORY_IMPL_H_ |