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