// 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" #include "opentelemetry/version.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace 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 GetTracerProvider() noexcept { std::lock_guard guard(GetLock()); return nostd::shared_ptr(GetProvider()); } /** * Changes the singleton TracerProvider. */ static void SetTracerProvider(const nostd::shared_ptr &tp) noexcept { std::lock_guard guard(GetLock()); GetProvider() = tp; } private: OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr &GetProvider() noexcept { static nostd::shared_ptr provider(new NoopTracerProvider); return provider; } OPENTELEMETRY_API_SINGLETON static common::SpinLockMutex &GetLock() noexcept { static common::SpinLockMutex lock; return lock; } }; } // namespace trace OPENTELEMETRY_END_NAMESPACE