// Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 #pragma once #include #include "opentelemetry/common/spin_lock_mutex.h" #include "opentelemetry/nostd/shared_ptr.h" #include "opentelemetry/trace/noop.h" #include "opentelemetry/trace/tracer_provider.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace trace { /** * Stores the singleton global TracerProvider. */ class 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 GetTracerProvider() noexcept { std::lock_guard guard(GetLock()); return nostd::shared_ptr(GetProvider()); } /** * Changes the singleton TracerProvider. */ static void SetTracerProvider(nostd::shared_ptr tp) noexcept { std::lock_guard guard(GetLock()); GetProvider() = tp; } private: static nostd::shared_ptr &GetProvider() noexcept { static nostd::shared_ptr provider(new NoopTracerProvider); return provider; } static common::SpinLockMutex &GetLock() noexcept { static common::SpinLockMutex lock; return lock; } }; } // namespace trace OPENTELEMETRY_END_NAMESPACE