| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 | // Copyright The OpenTelemetry Authors// SPDX-License-Identifier: Apache-2.0#pragma once#include <mutex>#include "opentelemetry/common/spin_lock_mutex.h"#include "opentelemetry/metrics/meter_provider.h"#include "opentelemetry/metrics/noop.h"#include "opentelemetry/nostd/shared_ptr.h"#include "opentelemetry/version.h"OPENTELEMETRY_BEGIN_NAMESPACEnamespace metrics{/** * Stores the singleton global MeterProvider. */class Provider{public:  /**   * Returns the singleton MeterProvider.   *   * By default, a no-op MeterProvider is returned. This will never return a   * nullptr MeterProvider.   */  static nostd::shared_ptr<MeterProvider> GetMeterProvider() noexcept  {    std::lock_guard<common::SpinLockMutex> guard(GetLock());    return nostd::shared_ptr<MeterProvider>(GetProvider());  }  /**   * Changes the singleton MeterProvider.   */  static void SetMeterProvider(const nostd::shared_ptr<MeterProvider> &tp) noexcept  {    std::lock_guard<common::SpinLockMutex> guard(GetLock());    GetProvider() = tp;  }private:  OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr<MeterProvider> &GetProvider() noexcept  {    static nostd::shared_ptr<MeterProvider> provider(new NoopMeterProvider);    return provider;  }  OPENTELEMETRY_API_SINGLETON static common::SpinLockMutex &GetLock() noexcept  {    static common::SpinLockMutex lock;    return lock;  }};}  // namespace metricsOPENTELEMETRY_END_NAMESPACE
 |