From a00484434d2b6e1f68f2b0360aae9855a745b9b5 Mon Sep 17 00:00:00 2001 From: Desp4 Date: Sat, 26 Sep 2026 22:35:53 +0300 Subject: [PATCH 01/11] attempt to resolve the dll singleton issue --- api/CMakeLists.txt | 32 +++- api/include/opentelemetry/baggage/baggage.h | 8 + .../common/detail/symbol_bridge_windows.h | 98 ++++++++++++ .../context/propagation/global_propagator.h | 12 ++ .../opentelemetry/context/runtime_context.h | 20 +++ api/include/opentelemetry/logs/provider.h | 16 ++ api/include/opentelemetry/metrics/provider.h | 12 ++ api/include/opentelemetry/trace/provider.h | 12 ++ api/include/opentelemetry/trace/trace_state.h | 14 ++ .../symbol_bridge_implementation_windows.cc | 150 ++++++++++++++++++ api/src/symbol_bridge_window.cc | 2 + api/test/singleton/CMakeLists.txt | 4 + api/test/singleton/singleton_test.cc | 2 +- 13 files changed, 380 insertions(+), 2 deletions(-) create mode 100644 api/include/opentelemetry/common/detail/symbol_bridge_windows.h create mode 100644 api/src/symbol_bridge_implementation_windows.cc create mode 100644 api/src/symbol_bridge_window.cc diff --git a/api/CMakeLists.txt b/api/CMakeLists.txt index 598a354927..9e57176ac0 100644 --- a/api/CMakeLists.txt +++ b/api/CMakeLists.txt @@ -8,6 +8,36 @@ target_include_directories( "$") set_target_properties(opentelemetry_api PROPERTIES EXPORT_NAME api) +set(EXPORTED_OTELCPP_TARGETS opentelemetry_api) + +if(WIN32) + # - api_static + add_library(opentelemetry_api_static STATIC src/symbol_bridge_window.cc) + target_link_libraries(opentelemetry_api_static PUBLIC opentelemetry_api) + target_compile_definitions(opentelemetry_api_static INTERFACE OPENTELEMETRY_SYMBOL_BRIDGE_NOINLINE) + set_target_properties(opentelemetry_api_static PROPERTIES EXPORT_NAME api_static) + + list(APPEND EXPORTED_OTELCPP_TARGETS opentelemetry_api_static) + + # - abi_symbol_bridge + add_library(opentelemetry_api_symbol_bridge SHARED src/symbol_bridge_implementation_windows.cc) + target_link_libraries(opentelemetry_api_symbol_bridge PRIVATE opentelemetry_api_static) + set_target_properties(opentelemetry_api_symbol_bridge PROPERTIES + EXPORT_NAME api_symbol_bridge + RUNTIME_OUTPUT_NAME opentelemetry_api_symbol_bridge + ) + + target_compile_options(opentelemetry_api_symbol_bridge PRIVATE + $<$:/wd4190> + $<$:-Wno-return-type-c-linkage> + ) + target_link_options(opentelemetry_api_symbol_bridge INTERFACE + $<$:/INCLUDE:OpenTelemetryAbiBridgeHook> + $<$:-Wl,-u,:OpenTelemetryAbiBridgeHook> + ) + + list(APPEND EXPORTED_OTELCPP_TARGETS opentelemetry_api_symbol_bridge) +endif() unset(TARGET_DEPS) @@ -129,7 +159,7 @@ otel_add_component( COMPONENT api TARGETS - opentelemetry_api + ${EXPORTED_OTELCPP_TARGETS} FILES_DIRECTORY "include/opentelemetry" FILES_DESTINATION diff --git a/api/include/opentelemetry/baggage/baggage.h b/api/include/opentelemetry/baggage/baggage.h index 2ee9f8ec6d..f96d9b6fc5 100644 --- a/api/include/opentelemetry/baggage/baggage.h +++ b/api/include/opentelemetry/baggage/baggage.h @@ -11,6 +11,10 @@ #include "opentelemetry/nostd/string_view.h" #include "opentelemetry/version.h" +#ifdef _WIN32 +# include "opentelemetry/common/detail/symbol_bridge_windows.h" +#endif + OPENTELEMETRY_BEGIN_NAMESPACE namespace baggage @@ -36,6 +40,10 @@ class OPENTELEMETRY_EXPORT Baggage OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr GetDefault() { +#ifdef _WIN32 + if (const auto address = common::detail::LoadSymbolBridgeSymbol (*)()>("OpenTelemetryBaggageBaggageGetDefault")) + return address(); +#endif static nostd::shared_ptr baggage{new Baggage()}; return baggage; } diff --git a/api/include/opentelemetry/common/detail/symbol_bridge_windows.h b/api/include/opentelemetry/common/detail/symbol_bridge_windows.h new file mode 100644 index 0000000000..de08805de8 --- /dev/null +++ b/api/include/opentelemetry/common/detail/symbol_bridge_windows.h @@ -0,0 +1,98 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include "opentelemetry/version.h" + +#ifndef OPENTELEMETRY_SYMBOL_BRIDGE_NOINLINE +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# ifndef NOMINMAX +# define NOMINMAX +# endif +# include +#endif + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace common +{ +namespace detail +{ + +struct LoadedBridgeSymbol +{ + void* address; + bool try_again; +}; + +LoadedBridgeSymbol LoadSymbolBridgeSymbol(const char* symbol_name) noexcept; + +template +Signature LoadSymbolBridgeSymbol(const char* symbol_name) noexcept +{ + static LoadedBridgeSymbol symbol{nullptr, true}; + if (!symbol.address && symbol.try_again) + { + symbol = LoadSymbolBridgeSymbol(symbol_name); + } + return reinterpret_cast(symbol.address); +} + +#ifndef OPENTELEMETRY_SYMBOL_BRIDGE_NOINLINE + +#ifndef OPENTELEMETRY_SYMBOL_BRIDGE_IMPL +inline +#endif +LoadedBridgeSymbol LoadSymbolBridgeSymbol(const char* symbol_name) noexcept +{ + struct ModuleLifetime + { + ::HMODULE module{nullptr}; + bool load_failed{false}; + + ~ModuleLifetime() + { + if (module) + { + ::FreeLibrary(module); + } + } + }; + + static ::ATOM bridge_present_atom{0}; + if (bridge_present_atom == 0) + { + bridge_present_atom = ::FindAtomW(L"otelcpp-abi-bridge"); + if (bridge_present_atom == 0) + { + return {nullptr, true}; + } + } + + static ModuleLifetime bridge_module{}; + if (!bridge_module.module) + { + if (bridge_module.load_failed) + { + return {nullptr, false}; + } + + ::GetModuleHandleExW(0x0, L"opentelemetry_api_symbol_bridge", &bridge_module.module); + bridge_module.load_failed = !bridge_module.module; + + if (bridge_module.load_failed) + { + return {nullptr, false}; + } + } + + const auto address = ::GetProcAddress(bridge_module.module, symbol_name); + return {reinterpret_cast(address), false}; +} +#endif + +} // namespace detail +} // namespace common +OPENTELEMETRY_END_NAMESPACE diff --git a/api/include/opentelemetry/context/propagation/global_propagator.h b/api/include/opentelemetry/context/propagation/global_propagator.h index 483b0e1fa7..392cf73043 100644 --- a/api/include/opentelemetry/context/propagation/global_propagator.h +++ b/api/include/opentelemetry/context/propagation/global_propagator.h @@ -13,6 +13,10 @@ #include "opentelemetry/version.h" +#ifdef _WIN32 +# include "opentelemetry/common/detail/symbol_bridge_windows.h" +#endif + OPENTELEMETRY_BEGIN_NAMESPACE namespace context { @@ -60,12 +64,20 @@ class OPENTELEMETRY_EXPORT GlobalTextMapPropagator private: OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr &GetPropagator() noexcept { +#ifdef _WIN32 + if (const auto address = common::detail::LoadSymbolBridgeSymbol& (*)()>("OpenTelemetryContextPropagationGlobalTextMapPropagatorGetPropagator")) + return address(); +#endif static nostd::shared_ptr propagator(new NoOpPropagator()); return propagator; } OPENTELEMETRY_API_SINGLETON static common::SpinLockMutex &GetLock() noexcept { +#ifdef _WIN32 + if (const auto address = common::detail::LoadSymbolBridgeSymbol("OpenTelemetryContextPropagationGlobalTextMapPropagatorGetLock")) + return address(); +#endif static common::SpinLockMutex lock; return lock; } diff --git a/api/include/opentelemetry/context/runtime_context.h b/api/include/opentelemetry/context/runtime_context.h index e86b8873f0..4d2bc9dc78 100644 --- a/api/include/opentelemetry/context/runtime_context.h +++ b/api/include/opentelemetry/context/runtime_context.h @@ -14,9 +14,18 @@ #include "opentelemetry/nostd/unique_ptr.h" #include "opentelemetry/version.h" +#ifdef _WIN32 +# include "opentelemetry/common/detail/symbol_bridge_windows.h" +#endif + OPENTELEMETRY_BEGIN_NAMESPACE namespace context { +namespace detail +{ +struct AbiBridgePrivacyIntruder; +} // namespace detail + // The Token object provides is returned when attaching objects to the // RuntimeContext object and is associated with a context object, and // can be provided to the RuntimeContext Detach method to remove the @@ -192,6 +201,10 @@ class OPENTELEMETRY_EXPORT RuntimeContext OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr &GetStorage() noexcept { +#ifdef _WIN32 + if (const auto address = common::detail::LoadSymbolBridgeSymbol& (*)()>("OpenTelemetryContextRuntimeContextGetStorage")) + return address(); +#endif static nostd::shared_ptr context(GetDefaultStorage()); return context; } @@ -250,10 +263,13 @@ class ThreadLocalContextStorage : public RuntimeContextStorage } private: + friend struct detail::AbiBridgePrivacyIntruder; + // A nested class to store the attached contexts in a stack. class Stack { friend class ThreadLocalContextStorage; + friend struct detail::AbiBridgePrivacyIntruder; /** * Limit the max stack depth. @@ -384,6 +400,10 @@ class ThreadLocalContextStorage : public RuntimeContextStorage OPENTELEMETRY_API_SINGLETON Stack &GetStack() { +#ifdef _WIN32 + if (const auto address = common::detail::LoadSymbolBridgeSymbol("OpenTelemetryContextThreadLocalContextStorageStackGetStack")) + return address(); +#endif static thread_local Stack stack_{}; return stack_; } diff --git a/api/include/opentelemetry/logs/provider.h b/api/include/opentelemetry/logs/provider.h index 1ed54bf410..2336b2a1c8 100644 --- a/api/include/opentelemetry/logs/provider.h +++ b/api/include/opentelemetry/logs/provider.h @@ -11,6 +11,10 @@ #include "opentelemetry/nostd/shared_ptr.h" #include "opentelemetry/version.h" +#ifdef _WIN32 +# include "opentelemetry/common/detail/symbol_bridge_windows.h" +#endif + OPENTELEMETRY_BEGIN_NAMESPACE namespace logs { @@ -97,6 +101,10 @@ class OPENTELEMETRY_EXPORT Provider private: OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr &GetProvider() noexcept { +#ifdef _WIN32 + if (const auto address = common::detail::LoadSymbolBridgeSymbol& (*)()>("OpenTelemetryLogsProviderGetProvider")) + return address(); +#endif static nostd::shared_ptr provider(new NoopLoggerProvider); return provider; } @@ -105,6 +113,10 @@ class OPENTELEMETRY_EXPORT Provider OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr & GetEventProvider() noexcept { +#ifdef _WIN32 + if (const auto address = common::detail::LoadSymbolBridgeSymbol& (*)()>("OpenTelemetryLogsProviderGetEventProvider")) + return address(); +#endif static nostd::shared_ptr provider(new NoopEventLoggerProvider); return provider; } @@ -112,6 +124,10 @@ class OPENTELEMETRY_EXPORT Provider OPENTELEMETRY_API_SINGLETON static common::SpinLockMutex &GetLock() noexcept { +#ifdef _WIN32 + if (const auto address = common::detail::LoadSymbolBridgeSymbol("OpenTelemetryLogsProviderGetLock")) + return address(); +#endif static common::SpinLockMutex lock; return lock; } diff --git a/api/include/opentelemetry/metrics/provider.h b/api/include/opentelemetry/metrics/provider.h index a1278a1098..8d35b82248 100644 --- a/api/include/opentelemetry/metrics/provider.h +++ b/api/include/opentelemetry/metrics/provider.h @@ -11,6 +11,10 @@ #include "opentelemetry/nostd/shared_ptr.h" #include "opentelemetry/version.h" +#ifdef _WIN32 +# include "opentelemetry/common/detail/symbol_bridge_windows.h" +#endif + OPENTELEMETRY_BEGIN_NAMESPACE namespace metrics { @@ -55,12 +59,20 @@ class Provider private: OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr &GetProvider() noexcept { +#ifdef _WIN32 + if (const auto address = common::detail::LoadSymbolBridgeSymbol& (*)()>("OpenTelemetryMetricsProviderGetProvider")) + return address(); +#endif static nostd::shared_ptr provider(new NoopMeterProvider); return provider; } OPENTELEMETRY_API_SINGLETON static common::SpinLockMutex &GetLock() noexcept { +#ifdef _WIN32 + if (const auto address = common::detail::LoadSymbolBridgeSymbol("OpenTelemetryMetricsProviderGetLock")) + return address(); +#endif static common::SpinLockMutex lock; return lock; } diff --git a/api/include/opentelemetry/trace/provider.h b/api/include/opentelemetry/trace/provider.h index 9b2dc7daa6..a7ce12bb54 100644 --- a/api/include/opentelemetry/trace/provider.h +++ b/api/include/opentelemetry/trace/provider.h @@ -11,6 +11,10 @@ #include "opentelemetry/trace/tracer_provider.h" #include "opentelemetry/version.h" +#ifdef _WIN32 +# include "opentelemetry/common/detail/symbol_bridge_windows.h" +#endif + OPENTELEMETRY_BEGIN_NAMESPACE namespace trace { @@ -55,12 +59,20 @@ class OPENTELEMETRY_EXPORT Provider private: OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr &GetProvider() noexcept { +#ifdef _WIN32 + if (const auto address = common::detail::LoadSymbolBridgeSymbol& (*)()>("OpenTelemetryTraceProviderGetProvider")) + return address(); +#endif static nostd::shared_ptr provider(new NoopTracerProvider); return provider; } OPENTELEMETRY_API_SINGLETON static common::SpinLockMutex &GetLock() noexcept { +#ifdef _WIN32 + if (const auto address = common::detail::LoadSymbolBridgeSymbol("OpenTelemetryTraceProviderGetLock")) + return address(); +#endif static common::SpinLockMutex lock; return lock; } diff --git a/api/include/opentelemetry/trace/trace_state.h b/api/include/opentelemetry/trace/trace_state.h index 730ce3f9c5..1848005cb8 100644 --- a/api/include/opentelemetry/trace/trace_state.h +++ b/api/include/opentelemetry/trace/trace_state.h @@ -15,9 +15,17 @@ #include "opentelemetry/nostd/unique_ptr.h" #include "opentelemetry/version.h" +#ifdef _WIN32 +# include "opentelemetry/common/detail/symbol_bridge_windows.h" +#endif + OPENTELEMETRY_BEGIN_NAMESPACE namespace trace { +namespace detail +{ +struct AbiBridgePrivacyIntruder; +} // namespace detail /** * TraceState carries tracing-system specific context in a list of key-value pairs. TraceState @@ -38,6 +46,10 @@ class OPENTELEMETRY_EXPORT TraceState OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr GetDefault() { +#ifdef _WIN32 + if (const auto address = common::detail::LoadSymbolBridgeSymbol (*)()>("OpenTelemetryTraceTraceStateGetDefault")) + return address(); +#endif static nostd::shared_ptr ts{new TraceState()}; return ts; } @@ -246,6 +258,8 @@ class OPENTELEMETRY_EXPORT TraceState } private: + friend struct detail::AbiBridgePrivacyIntruder; + TraceState() : kv_properties_(new common::KeyValueProperties()) {} TraceState(size_t size) : kv_properties_(new common::KeyValueProperties(size)) {} diff --git a/api/src/symbol_bridge_implementation_windows.cc b/api/src/symbol_bridge_implementation_windows.cc new file mode 100644 index 0000000000..7724c7a597 --- /dev/null +++ b/api/src/symbol_bridge_implementation_windows.cc @@ -0,0 +1,150 @@ +#include "opentelemetry/baggage/baggage.h" +#include "opentelemetry/context/runtime_context.h" +#include "opentelemetry/context/propagation/global_propagator.h" + +#include "opentelemetry/logs/provider.h" +#include "opentelemetry/trace/provider.h" +#include "opentelemetry/metrics/provider.h" + +#include + +// privacy intruders +OPENTELEMETRY_BEGIN_NAMESPACE +namespace context +{ +namespace detail +{ +struct AbiBridgePrivacyIntruder +{ + using ThreadLocalContextStorageStack = ThreadLocalContextStorage::Stack; + + static ThreadLocalContextStorageStack &GetThreadLocalContextStorageStack() + { + static thread_local ThreadLocalContextStorage::Stack stack_{}; + return stack_; + } +}; +} // namespace detail +} // namespace context + +namespace trace +{ +namespace detail +{ +struct AbiBridgePrivacyIntruder +{ + static nostd::shared_ptr GetDefaultTraceState() + { + static nostd::shared_ptr ts{new TraceState()}; + return ts; + } +}; +} // namespace detail +} // namespace trace +OPENTELEMETRY_END_NAMESPACE + +// atom lifetime +namespace +{ +struct AtomLifetime +{ + AtomLifetime() : atom{::AddAtomW(L"otelcpp-abi-bridge")} {} + ~AtomLifetime() + { + if (atom != 0) + ::DeleteAtom(atom); + } + + ::ATOM atom{0}; +}; + +const AtomLifetime bridgeAtom{}; +} + +extern "C" { + +__declspec(dllexport) void OpenTelemetryAbiBridgeHook() {} + +// - baggage +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr OpenTelemetryBaggageBaggageGetDefault() +{ + static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr baggage{new OPENTELEMETRY_NAMESPACE::baggage::Baggage()}; + return baggage; +} + +// - runtime_context +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr &OpenTelemetryContextRuntimeContextGetStorage() +{ + static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr context(OPENTELEMETRY_NAMESPACE::context::GetDefaultStorage()); + return context; +} +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::context::detail::AbiBridgePrivacyIntruder::ThreadLocalContextStorageStack &OpenTelemetryContextThreadLocalContextStorageStackGetStack() +{ + return OPENTELEMETRY_NAMESPACE::context::detail::AbiBridgePrivacyIntruder::GetThreadLocalContextStorageStack(); +} + +// - global_propagator +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr &OpenTelemetryContextPropagationGlobalTextMapPropagatorGetPropagator() +{ + static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr propagator(new OPENTELEMETRY_NAMESPACE::context::propagation::NoOpPropagator()); + return propagator; +} +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex &OpenTelemetryContextPropagationGlobalTextMapPropagatorGetLock() +{ + static OPENTELEMETRY_NAMESPACE::common::SpinLockMutex lock; + return lock; +} + +// - logs provider +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr &OpenTelemetryLogsProviderGetProvider() +{ + static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr provider(new OPENTELEMETRY_NAMESPACE::logs::NoopLoggerProvider); + return provider; +} + +#if OPENTELEMETRY_ABI_VERSION_NO < 2 +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr &OpenTelemetryLogsProviderGetEventProvider() +{ + static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr provider(new OPENTELEMETRY_NAMESPACE::logs::NoopEventLoggerProvider); + return provider; +} +#endif + +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex &OpenTelemetryLogsProviderGetLock() +{ + static OPENTELEMETRY_NAMESPACE::common::SpinLockMutex lock; + return lock; +} + +// - metrics provider +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr &OpenTelemetryMetricsProviderGetProvider() +{ + static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr provider(new OPENTELEMETRY_NAMESPACE::metrics::NoopMeterProvider); + return provider; +} +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex &OpenTelemetryMetricsProviderGetLock() +{ + static OPENTELEMETRY_NAMESPACE::common::SpinLockMutex lock; + return lock; +} + +// - trace provider +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr &OpenTelemetryTraceProviderGetProvider() +{ + static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr provider(new OPENTELEMETRY_NAMESPACE::trace::NoopTracerProvider); + return provider; +} + +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex &OpenTelemetryTraceProviderGetLock() +{ + static OPENTELEMETRY_NAMESPACE::common::SpinLockMutex lock; + return lock; +} + +// - trace_state +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr OpenTelemetryTraceTraceStateGetDefault() +{ + return OPENTELEMETRY_NAMESPACE::trace::detail::AbiBridgePrivacyIntruder::GetDefaultTraceState(); +} + +} diff --git a/api/src/symbol_bridge_window.cc b/api/src/symbol_bridge_window.cc new file mode 100644 index 0000000000..be530b3dae --- /dev/null +++ b/api/src/symbol_bridge_window.cc @@ -0,0 +1,2 @@ +#define OPENTELEMETRY_SYMBOL_BRIDGE_IMPL +#include "opentelemetry/common/detail/symbol_bridge_windows.h" diff --git a/api/test/singleton/CMakeLists.txt b/api/test/singleton/CMakeLists.txt index 7c30d6e571..5274f8f631 100644 --- a/api/test/singleton/CMakeLists.txt +++ b/api/test/singleton/CMakeLists.txt @@ -17,6 +17,10 @@ add_library(component_d SHARED component_d.cc) set_target_properties(component_d PROPERTIES CXX_VISIBILITY_PRESET hidden) target_link_libraries(component_d opentelemetry_api) +if(WIN32) + target_link_libraries(component_d opentelemetry_api_symbol_bridge) +endif() + add_library(component_e SHARED component_e.cc) set_target_properties(component_e PROPERTIES CXX_VISIBILITY_PRESET default) target_link_libraries(component_e opentelemetry_api) diff --git a/api/test/singleton/singleton_test.cc b/api/test/singleton/singleton_test.cc index e63e00c11e..79d791b1bb 100644 --- a/api/test/singleton/singleton_test.cc +++ b/api/test/singleton/singleton_test.cc @@ -355,7 +355,7 @@ static void cleanup_otel() // TODO: Remove once windows api singletons are supported. // See https://github.com/open-telemetry/opentelemetry-cpp/issues/2534 #ifdef _WIN32 -# define RUN_FAILING_WINDOWS_TEST 0 +# define RUN_FAILING_WINDOWS_TEST 1 #else # define RUN_FAILING_WINDOWS_TEST 1 #endif From d270e52771a2b2a88836844d8f8309765f8ee515 Mon Sep 17 00:00:00 2001 From: Desp4 Date: Sat, 26 Sep 2026 23:20:11 +0300 Subject: [PATCH 02/11] run all singleton tests on windows as well --- api/test/singleton/singleton_test.cc | 48 +++++++++++----------------- 1 file changed, 18 insertions(+), 30 deletions(-) diff --git a/api/test/singleton/singleton_test.cc b/api/test/singleton/singleton_test.cc index 79d791b1bb..146d36a205 100644 --- a/api/test/singleton/singleton_test.cc +++ b/api/test/singleton/singleton_test.cc @@ -352,14 +352,6 @@ static void cleanup_otel() trace_api::Provider::SetTracerProvider(provider); } -// TODO: Remove once windows api singletons are supported. -// See https://github.com/open-telemetry/opentelemetry-cpp/issues/2534 -#ifdef _WIN32 -# define RUN_FAILING_WINDOWS_TEST 1 -#else -# define RUN_FAILING_WINDOWS_TEST 1 -#endif - TEST(SingletonTest, Uniqueness) { do_something(); @@ -402,30 +394,26 @@ TEST(SingletonTest, Uniqueness) EXPECT_EQ(span_b_f1_count, 2); EXPECT_EQ(span_b_f2_count, 1); -#if RUN_FAILING_WINDOWS_TEST - EXPECT_EQ(span_c_lib_count, 1); // Fails with shared libraries on Windows - EXPECT_EQ(span_c_f1_count, 2); // Fails with shared libraries on Windows - EXPECT_EQ(span_c_f2_count, 1); // Fails with shared libraries on Windows - EXPECT_EQ(span_d_lib_count, 1); // Fails with shared libraries on Windows - EXPECT_EQ(span_d_f1_count, 2); // Fails with shared libraries on Windows - EXPECT_EQ(span_d_f2_count, 1); // Fails with shared libraries on Windows - EXPECT_EQ(span_e_lib_count, 1); // Fails with shared libraries on Windows - EXPECT_EQ(span_e_f1_count, 2); // Fails with shared libraries on Windows - EXPECT_EQ(span_e_f2_count, 1); // Fails with shared libraries on Windows - EXPECT_EQ(span_f_lib_count, 1); // Fails with shared libraries on Windows - EXPECT_EQ(span_f_f1_count, 2); // Fails with shared libraries on Windows - EXPECT_EQ(span_f_f2_count, 1); // Fails with shared libraries on Windows -#endif + EXPECT_EQ(span_c_lib_count, 1); + EXPECT_EQ(span_c_f1_count, 2); + EXPECT_EQ(span_c_f2_count, 1); + EXPECT_EQ(span_d_lib_count, 1); + EXPECT_EQ(span_d_f1_count, 2); + EXPECT_EQ(span_d_f2_count, 1); + EXPECT_EQ(span_e_lib_count, 1); + EXPECT_EQ(span_e_f1_count, 2); + EXPECT_EQ(span_e_f2_count, 1); + EXPECT_EQ(span_f_lib_count, 1); + EXPECT_EQ(span_f_f1_count, 2); + EXPECT_EQ(span_f_f2_count, 1); #ifndef BAZEL_BUILD -# if RUN_FAILING_WINDOWS_TEST - EXPECT_EQ(span_g_lib_count, 1); // Fails with shared libraries on Windows - EXPECT_EQ(span_g_f1_count, 2); // Fails with shared libraries on Windows - EXPECT_EQ(span_g_f2_count, 1); // Fails with shared libraries on Windows - EXPECT_EQ(span_h_lib_count, 1); // Fails with shared libraries on Windows - EXPECT_EQ(span_h_f1_count, 2); // Fails with shared libraries on Windows - EXPECT_EQ(span_h_f2_count, 1); // Fails with shared libraries on Windows -# endif + EXPECT_EQ(span_g_lib_count, 1); + EXPECT_EQ(span_g_f1_count, 2); + EXPECT_EQ(span_g_f2_count, 1); + EXPECT_EQ(span_h_lib_count, 1); + EXPECT_EQ(span_h_f1_count, 2); + EXPECT_EQ(span_h_f2_count, 1); #endif EXPECT_EQ(unknown_span_count, 0); From 50348321bacad2ead096fcf10c8099b37e6b14ed Mon Sep 17 00:00:00 2001 From: Desp4 Date: Sat, 26 Sep 2026 23:32:32 +0300 Subject: [PATCH 03/11] fix a typo in compiler options --- api/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/CMakeLists.txt b/api/CMakeLists.txt index 9e57176ac0..2f03d672d5 100644 --- a/api/CMakeLists.txt +++ b/api/CMakeLists.txt @@ -33,7 +33,7 @@ if(WIN32) ) target_link_options(opentelemetry_api_symbol_bridge INTERFACE $<$:/INCLUDE:OpenTelemetryAbiBridgeHook> - $<$:-Wl,-u,:OpenTelemetryAbiBridgeHook> + $<$:-Wl,-u,OpenTelemetryAbiBridgeHook> ) list(APPEND EXPORTED_OTELCPP_TARGETS opentelemetry_api_symbol_bridge) From c6fd3899cbac886a0b9e7987239a5f4f81444d7b Mon Sep 17 00:00:00 2001 From: Desp4 Date: Sat, 26 Sep 2026 23:35:20 +0300 Subject: [PATCH 04/11] add missing licenses --- api/src/symbol_bridge_implementation_windows.cc | 3 +++ api/src/symbol_bridge_window.cc | 3 +++ 2 files changed, 6 insertions(+) diff --git a/api/src/symbol_bridge_implementation_windows.cc b/api/src/symbol_bridge_implementation_windows.cc index 7724c7a597..2cc07f6444 100644 --- a/api/src/symbol_bridge_implementation_windows.cc +++ b/api/src/symbol_bridge_implementation_windows.cc @@ -1,3 +1,6 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + #include "opentelemetry/baggage/baggage.h" #include "opentelemetry/context/runtime_context.h" #include "opentelemetry/context/propagation/global_propagator.h" diff --git a/api/src/symbol_bridge_window.cc b/api/src/symbol_bridge_window.cc index be530b3dae..31c75a70be 100644 --- a/api/src/symbol_bridge_window.cc +++ b/api/src/symbol_bridge_window.cc @@ -1,2 +1,5 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + #define OPENTELEMETRY_SYMBOL_BRIDGE_IMPL #include "opentelemetry/common/detail/symbol_bridge_windows.h" From eb84855d08850491f405683838a6cf3df916e96e Mon Sep 17 00:00:00 2001 From: Desp4 Date: Thu, 1 Oct 2026 23:47:45 +0300 Subject: [PATCH 05/11] fix formatting, remove static api lib, update ci test script --- api/CMakeLists.txt | 10 +- api/include/opentelemetry/baggage/baggage.h | 6 +- .../common/detail/symbol_bridge_windows.h | 20 ++-- .../context/propagation/global_propagator.h | 10 +- .../opentelemetry/context/runtime_context.h | 11 ++- api/include/opentelemetry/logs/provider.h | 18 ++-- api/include/opentelemetry/metrics/provider.h | 10 +- api/include/opentelemetry/trace/provider.h | 10 +- api/include/opentelemetry/trace/trace_state.h | 8 +- .../symbol_bridge_implementation_windows.cc | 91 ++++++++++++------- api/src/symbol_bridge_window.cc | 5 - ci/do_ci.ps1 | 1 + 12 files changed, 121 insertions(+), 79 deletions(-) delete mode 100644 api/src/symbol_bridge_window.cc diff --git a/api/CMakeLists.txt b/api/CMakeLists.txt index 2f03d672d5..a45ae3cd33 100644 --- a/api/CMakeLists.txt +++ b/api/CMakeLists.txt @@ -11,17 +11,9 @@ set_target_properties(opentelemetry_api PROPERTIES EXPORT_NAME api) set(EXPORTED_OTELCPP_TARGETS opentelemetry_api) if(WIN32) - # - api_static - add_library(opentelemetry_api_static STATIC src/symbol_bridge_window.cc) - target_link_libraries(opentelemetry_api_static PUBLIC opentelemetry_api) - target_compile_definitions(opentelemetry_api_static INTERFACE OPENTELEMETRY_SYMBOL_BRIDGE_NOINLINE) - set_target_properties(opentelemetry_api_static PROPERTIES EXPORT_NAME api_static) - - list(APPEND EXPORTED_OTELCPP_TARGETS opentelemetry_api_static) - # - abi_symbol_bridge add_library(opentelemetry_api_symbol_bridge SHARED src/symbol_bridge_implementation_windows.cc) - target_link_libraries(opentelemetry_api_symbol_bridge PRIVATE opentelemetry_api_static) + target_link_libraries(opentelemetry_api_symbol_bridge PRIVATE opentelemetry_api) set_target_properties(opentelemetry_api_symbol_bridge PROPERTIES EXPORT_NAME api_symbol_bridge RUNTIME_OUTPUT_NAME opentelemetry_api_symbol_bridge diff --git a/api/include/opentelemetry/baggage/baggage.h b/api/include/opentelemetry/baggage/baggage.h index f96d9b6fc5..1ff4f8a846 100644 --- a/api/include/opentelemetry/baggage/baggage.h +++ b/api/include/opentelemetry/baggage/baggage.h @@ -12,7 +12,7 @@ #include "opentelemetry/version.h" #ifdef _WIN32 -# include "opentelemetry/common/detail/symbol_bridge_windows.h" +# include "opentelemetry/common/detail/symbol_bridge_windows.h" #endif OPENTELEMETRY_BEGIN_NAMESPACE @@ -41,7 +41,9 @@ class OPENTELEMETRY_EXPORT Baggage OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr GetDefault() { #ifdef _WIN32 - if (const auto address = common::detail::LoadSymbolBridgeSymbol (*)()>("OpenTelemetryBaggageBaggageGetDefault")) + if (const auto address = + common::detail::LoadSymbolBridgeSymbol (*)()>( + "OpenTelemetryBaggageBaggageGetDefault")) return address(); #endif static nostd::shared_ptr baggage{new Baggage()}; diff --git a/api/include/opentelemetry/common/detail/symbol_bridge_windows.h b/api/include/opentelemetry/common/detail/symbol_bridge_windows.h index de08805de8..a3460d8e12 100644 --- a/api/include/opentelemetry/common/detail/symbol_bridge_windows.h +++ b/api/include/opentelemetry/common/detail/symbol_bridge_windows.h @@ -23,14 +23,14 @@ namespace detail struct LoadedBridgeSymbol { - void* address; + void *address; bool try_again; }; -LoadedBridgeSymbol LoadSymbolBridgeSymbol(const char* symbol_name) noexcept; +LoadedBridgeSymbol LoadSymbolBridgeSymbol(const char *symbol_name) noexcept; -template -Signature LoadSymbolBridgeSymbol(const char* symbol_name) noexcept +template +Signature LoadSymbolBridgeSymbol(const char *symbol_name) noexcept { static LoadedBridgeSymbol symbol{nullptr, true}; if (!symbol.address && symbol.try_again) @@ -41,11 +41,11 @@ Signature LoadSymbolBridgeSymbol(const char* symbol_name) noexcept } #ifndef OPENTELEMETRY_SYMBOL_BRIDGE_NOINLINE - -#ifndef OPENTELEMETRY_SYMBOL_BRIDGE_IMPL inline #endif -LoadedBridgeSymbol LoadSymbolBridgeSymbol(const char* symbol_name) noexcept + +#if !defined(OPENTELEMETRY_SYMBOL_BRIDGE_NOINLINE) || defined(OPENTELEMETRY_SYMBOL_BRIDGE_IMPL) + LoadedBridgeSymbol LoadSymbolBridgeSymbol(const char *symbol_name) noexcept { struct ModuleLifetime { @@ -89,10 +89,10 @@ LoadedBridgeSymbol LoadSymbolBridgeSymbol(const char* symbol_name) noexcept } const auto address = ::GetProcAddress(bridge_module.module, symbol_name); - return {reinterpret_cast(address), false}; + return {reinterpret_cast(address), false}; } #endif -} // namespace detail -} // namespace common +} // namespace detail +} // namespace common OPENTELEMETRY_END_NAMESPACE diff --git a/api/include/opentelemetry/context/propagation/global_propagator.h b/api/include/opentelemetry/context/propagation/global_propagator.h index 392cf73043..c9dc1d25be 100644 --- a/api/include/opentelemetry/context/propagation/global_propagator.h +++ b/api/include/opentelemetry/context/propagation/global_propagator.h @@ -14,7 +14,7 @@ #include "opentelemetry/version.h" #ifdef _WIN32 -# include "opentelemetry/common/detail/symbol_bridge_windows.h" +# include "opentelemetry/common/detail/symbol_bridge_windows.h" #endif OPENTELEMETRY_BEGIN_NAMESPACE @@ -65,7 +65,9 @@ class OPENTELEMETRY_EXPORT GlobalTextMapPropagator OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr &GetPropagator() noexcept { #ifdef _WIN32 - if (const auto address = common::detail::LoadSymbolBridgeSymbol& (*)()>("OpenTelemetryContextPropagationGlobalTextMapPropagatorGetPropagator")) + if (const auto address = + common::detail::LoadSymbolBridgeSymbol &(*)()>( + "OpenTelemetryContextPropagationGlobalTextMapPropagatorGetPropagator")) return address(); #endif static nostd::shared_ptr propagator(new NoOpPropagator()); @@ -75,7 +77,9 @@ class OPENTELEMETRY_EXPORT GlobalTextMapPropagator OPENTELEMETRY_API_SINGLETON static common::SpinLockMutex &GetLock() noexcept { #ifdef _WIN32 - if (const auto address = common::detail::LoadSymbolBridgeSymbol("OpenTelemetryContextPropagationGlobalTextMapPropagatorGetLock")) + if (const auto address = + common::detail::LoadSymbolBridgeSymbol( + "OpenTelemetryContextPropagationGlobalTextMapPropagatorGetLock")) return address(); #endif static common::SpinLockMutex lock; diff --git a/api/include/opentelemetry/context/runtime_context.h b/api/include/opentelemetry/context/runtime_context.h index 4d2bc9dc78..0e8bb68f4c 100644 --- a/api/include/opentelemetry/context/runtime_context.h +++ b/api/include/opentelemetry/context/runtime_context.h @@ -15,7 +15,7 @@ #include "opentelemetry/version.h" #ifdef _WIN32 -# include "opentelemetry/common/detail/symbol_bridge_windows.h" +# include "opentelemetry/common/detail/symbol_bridge_windows.h" #endif OPENTELEMETRY_BEGIN_NAMESPACE @@ -24,7 +24,7 @@ namespace context namespace detail { struct AbiBridgePrivacyIntruder; -} // namespace detail +} // namespace detail // The Token object provides is returned when attaching objects to the // RuntimeContext object and is associated with a context object, and @@ -202,7 +202,9 @@ class OPENTELEMETRY_EXPORT RuntimeContext OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr &GetStorage() noexcept { #ifdef _WIN32 - if (const auto address = common::detail::LoadSymbolBridgeSymbol& (*)()>("OpenTelemetryContextRuntimeContextGetStorage")) + if (const auto address = + common::detail::LoadSymbolBridgeSymbol &(*)()>( + "OpenTelemetryContextRuntimeContextGetStorage")) return address(); #endif static nostd::shared_ptr context(GetDefaultStorage()); @@ -401,7 +403,8 @@ class ThreadLocalContextStorage : public RuntimeContextStorage OPENTELEMETRY_API_SINGLETON Stack &GetStack() { #ifdef _WIN32 - if (const auto address = common::detail::LoadSymbolBridgeSymbol("OpenTelemetryContextThreadLocalContextStorageStackGetStack")) + if (const auto address = common::detail::LoadSymbolBridgeSymbol( + "OpenTelemetryContextThreadLocalContextStorageStackGetStack")) return address(); #endif static thread_local Stack stack_{}; diff --git a/api/include/opentelemetry/logs/provider.h b/api/include/opentelemetry/logs/provider.h index 2336b2a1c8..3f67960da0 100644 --- a/api/include/opentelemetry/logs/provider.h +++ b/api/include/opentelemetry/logs/provider.h @@ -12,7 +12,7 @@ #include "opentelemetry/version.h" #ifdef _WIN32 -# include "opentelemetry/common/detail/symbol_bridge_windows.h" +# include "opentelemetry/common/detail/symbol_bridge_windows.h" #endif OPENTELEMETRY_BEGIN_NAMESPACE @@ -102,7 +102,9 @@ class OPENTELEMETRY_EXPORT Provider OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr &GetProvider() noexcept { #ifdef _WIN32 - if (const auto address = common::detail::LoadSymbolBridgeSymbol& (*)()>("OpenTelemetryLogsProviderGetProvider")) + if (const auto address = + common::detail::LoadSymbolBridgeSymbol &(*)()>( + "OpenTelemetryLogsProviderGetProvider")) return address(); #endif static nostd::shared_ptr provider(new NoopLoggerProvider); @@ -113,10 +115,12 @@ class OPENTELEMETRY_EXPORT Provider OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr & GetEventProvider() noexcept { -#ifdef _WIN32 - if (const auto address = common::detail::LoadSymbolBridgeSymbol& (*)()>("OpenTelemetryLogsProviderGetEventProvider")) +# ifdef _WIN32 + if (const auto address = + common::detail::LoadSymbolBridgeSymbol &(*)()>( + "OpenTelemetryLogsProviderGetEventProvider")) return address(); -#endif +# endif static nostd::shared_ptr provider(new NoopEventLoggerProvider); return provider; } @@ -125,7 +129,9 @@ class OPENTELEMETRY_EXPORT Provider OPENTELEMETRY_API_SINGLETON static common::SpinLockMutex &GetLock() noexcept { #ifdef _WIN32 - if (const auto address = common::detail::LoadSymbolBridgeSymbol("OpenTelemetryLogsProviderGetLock")) + if (const auto address = + common::detail::LoadSymbolBridgeSymbol( + "OpenTelemetryLogsProviderGetLock")) return address(); #endif static common::SpinLockMutex lock; diff --git a/api/include/opentelemetry/metrics/provider.h b/api/include/opentelemetry/metrics/provider.h index 8d35b82248..6e910bd203 100644 --- a/api/include/opentelemetry/metrics/provider.h +++ b/api/include/opentelemetry/metrics/provider.h @@ -12,7 +12,7 @@ #include "opentelemetry/version.h" #ifdef _WIN32 -# include "opentelemetry/common/detail/symbol_bridge_windows.h" +# include "opentelemetry/common/detail/symbol_bridge_windows.h" #endif OPENTELEMETRY_BEGIN_NAMESPACE @@ -60,7 +60,9 @@ class Provider OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr &GetProvider() noexcept { #ifdef _WIN32 - if (const auto address = common::detail::LoadSymbolBridgeSymbol& (*)()>("OpenTelemetryMetricsProviderGetProvider")) + if (const auto address = + common::detail::LoadSymbolBridgeSymbol &(*)()>( + "OpenTelemetryMetricsProviderGetProvider")) return address(); #endif static nostd::shared_ptr provider(new NoopMeterProvider); @@ -70,7 +72,9 @@ class Provider OPENTELEMETRY_API_SINGLETON static common::SpinLockMutex &GetLock() noexcept { #ifdef _WIN32 - if (const auto address = common::detail::LoadSymbolBridgeSymbol("OpenTelemetryMetricsProviderGetLock")) + if (const auto address = + common::detail::LoadSymbolBridgeSymbol( + "OpenTelemetryMetricsProviderGetLock")) return address(); #endif static common::SpinLockMutex lock; diff --git a/api/include/opentelemetry/trace/provider.h b/api/include/opentelemetry/trace/provider.h index a7ce12bb54..e1f7501d09 100644 --- a/api/include/opentelemetry/trace/provider.h +++ b/api/include/opentelemetry/trace/provider.h @@ -12,7 +12,7 @@ #include "opentelemetry/version.h" #ifdef _WIN32 -# include "opentelemetry/common/detail/symbol_bridge_windows.h" +# include "opentelemetry/common/detail/symbol_bridge_windows.h" #endif OPENTELEMETRY_BEGIN_NAMESPACE @@ -60,7 +60,9 @@ class OPENTELEMETRY_EXPORT Provider OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr &GetProvider() noexcept { #ifdef _WIN32 - if (const auto address = common::detail::LoadSymbolBridgeSymbol& (*)()>("OpenTelemetryTraceProviderGetProvider")) + if (const auto address = + common::detail::LoadSymbolBridgeSymbol &(*)()>( + "OpenTelemetryTraceProviderGetProvider")) return address(); #endif static nostd::shared_ptr provider(new NoopTracerProvider); @@ -70,7 +72,9 @@ class OPENTELEMETRY_EXPORT Provider OPENTELEMETRY_API_SINGLETON static common::SpinLockMutex &GetLock() noexcept { #ifdef _WIN32 - if (const auto address = common::detail::LoadSymbolBridgeSymbol("OpenTelemetryTraceProviderGetLock")) + if (const auto address = + common::detail::LoadSymbolBridgeSymbol( + "OpenTelemetryTraceProviderGetLock")) return address(); #endif static common::SpinLockMutex lock; diff --git a/api/include/opentelemetry/trace/trace_state.h b/api/include/opentelemetry/trace/trace_state.h index 1848005cb8..e91302347f 100644 --- a/api/include/opentelemetry/trace/trace_state.h +++ b/api/include/opentelemetry/trace/trace_state.h @@ -16,7 +16,7 @@ #include "opentelemetry/version.h" #ifdef _WIN32 -# include "opentelemetry/common/detail/symbol_bridge_windows.h" +# include "opentelemetry/common/detail/symbol_bridge_windows.h" #endif OPENTELEMETRY_BEGIN_NAMESPACE @@ -25,7 +25,7 @@ namespace trace namespace detail { struct AbiBridgePrivacyIntruder; -} // namespace detail +} // namespace detail /** * TraceState carries tracing-system specific context in a list of key-value pairs. TraceState @@ -47,7 +47,9 @@ class OPENTELEMETRY_EXPORT TraceState OPENTELEMETRY_API_SINGLETON static nostd::shared_ptr GetDefault() { #ifdef _WIN32 - if (const auto address = common::detail::LoadSymbolBridgeSymbol (*)()>("OpenTelemetryTraceTraceStateGetDefault")) + if (const auto address = + common::detail::LoadSymbolBridgeSymbol (*)()>( + "OpenTelemetryTraceTraceStateGetDefault")) return address(); #endif static nostd::shared_ptr ts{new TraceState()}; diff --git a/api/src/symbol_bridge_implementation_windows.cc b/api/src/symbol_bridge_implementation_windows.cc index 2cc07f6444..a03208cb5a 100644 --- a/api/src/symbol_bridge_implementation_windows.cc +++ b/api/src/symbol_bridge_implementation_windows.cc @@ -2,12 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 #include "opentelemetry/baggage/baggage.h" -#include "opentelemetry/context/runtime_context.h" #include "opentelemetry/context/propagation/global_propagator.h" +#include "opentelemetry/context/runtime_context.h" #include "opentelemetry/logs/provider.h" -#include "opentelemetry/trace/provider.h" #include "opentelemetry/metrics/provider.h" +#include "opentelemetry/trace/provider.h" #include @@ -20,15 +20,15 @@ namespace detail struct AbiBridgePrivacyIntruder { using ThreadLocalContextStorageStack = ThreadLocalContextStorage::Stack; - + static ThreadLocalContextStorageStack &GetThreadLocalContextStorageStack() { static thread_local ThreadLocalContextStorage::Stack stack_{}; return stack_; } }; -} // namespace detail -} // namespace context +} // namespace detail +} // namespace context namespace trace { @@ -42,8 +42,8 @@ struct AbiBridgePrivacyIntruder return ts; } }; -} // namespace detail -} // namespace trace +} // namespace detail +} // namespace trace OPENTELEMETRY_END_NAMESPACE // atom lifetime @@ -57,97 +57,126 @@ struct AtomLifetime if (atom != 0) ::DeleteAtom(atom); } - + ::ATOM atom{0}; }; const AtomLifetime bridgeAtom{}; -} +} // namespace extern "C" { __declspec(dllexport) void OpenTelemetryAbiBridgeHook() {} // - baggage -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr OpenTelemetryBaggageBaggageGetDefault() +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr +OpenTelemetryBaggageBaggageGetDefault() { - static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr baggage{new OPENTELEMETRY_NAMESPACE::baggage::Baggage()}; + static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr baggage{ + new OPENTELEMETRY_NAMESPACE::baggage::Baggage()}; return baggage; } // - runtime_context -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr &OpenTelemetryContextRuntimeContextGetStorage() +__declspec(dllexport) +OPENTELEMETRY_NAMESPACE::nostd::shared_ptr & +OpenTelemetryContextRuntimeContextGetStorage() { - static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr context(OPENTELEMETRY_NAMESPACE::context::GetDefaultStorage()); + static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr + context(OPENTELEMETRY_NAMESPACE::context::GetDefaultStorage()); return context; } -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::context::detail::AbiBridgePrivacyIntruder::ThreadLocalContextStorageStack &OpenTelemetryContextThreadLocalContextStorageStackGetStack() +__declspec(dllexport) +OPENTELEMETRY_NAMESPACE::context::detail::AbiBridgePrivacyIntruder::ThreadLocalContextStorageStack & +OpenTelemetryContextThreadLocalContextStorageStackGetStack() { - return OPENTELEMETRY_NAMESPACE::context::detail::AbiBridgePrivacyIntruder::GetThreadLocalContextStorageStack(); + return OPENTELEMETRY_NAMESPACE::context::detail::AbiBridgePrivacyIntruder:: + GetThreadLocalContextStorageStack(); } // - global_propagator -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr &OpenTelemetryContextPropagationGlobalTextMapPropagatorGetPropagator() +__declspec(dllexport) +OPENTELEMETRY_NAMESPACE::nostd::shared_ptr & +OpenTelemetryContextPropagationGlobalTextMapPropagatorGetPropagator() { - static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr propagator(new OPENTELEMETRY_NAMESPACE::context::propagation::NoOpPropagator()); + static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr< + opentelemetry::context::propagation::TextMapPropagator> + propagator(new OPENTELEMETRY_NAMESPACE::context::propagation::NoOpPropagator()); return propagator; } -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex &OpenTelemetryContextPropagationGlobalTextMapPropagatorGetLock() +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex & +OpenTelemetryContextPropagationGlobalTextMapPropagatorGetLock() { static OPENTELEMETRY_NAMESPACE::common::SpinLockMutex lock; return lock; } // - logs provider -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr &OpenTelemetryLogsProviderGetProvider() +__declspec(dllexport) +OPENTELEMETRY_NAMESPACE::nostd::shared_ptr & +OpenTelemetryLogsProviderGetProvider() { - static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr provider(new OPENTELEMETRY_NAMESPACE::logs::NoopLoggerProvider); + static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr + provider(new OPENTELEMETRY_NAMESPACE::logs::NoopLoggerProvider); return provider; } #if OPENTELEMETRY_ABI_VERSION_NO < 2 -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr &OpenTelemetryLogsProviderGetEventProvider() +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr< + OPENTELEMETRY_NAMESPACE::logs::EventLoggerProvider> &OpenTelemetryLogsProviderGetEventProvider() { - static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr provider(new OPENTELEMETRY_NAMESPACE::logs::NoopEventLoggerProvider); + static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr< + OPENTELEMETRY_NAMESPACE::logs::EventLoggerProvider> + provider(new OPENTELEMETRY_NAMESPACE::logs::NoopEventLoggerProvider); return provider; } #endif -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex &OpenTelemetryLogsProviderGetLock() +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex & +OpenTelemetryLogsProviderGetLock() { static OPENTELEMETRY_NAMESPACE::common::SpinLockMutex lock; return lock; } // - metrics provider -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr &OpenTelemetryMetricsProviderGetProvider() +__declspec(dllexport) +OPENTELEMETRY_NAMESPACE::nostd::shared_ptr & +OpenTelemetryMetricsProviderGetProvider() { - static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr provider(new OPENTELEMETRY_NAMESPACE::metrics::NoopMeterProvider); + static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr + provider(new OPENTELEMETRY_NAMESPACE::metrics::NoopMeterProvider); return provider; } -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex &OpenTelemetryMetricsProviderGetLock() +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex & +OpenTelemetryMetricsProviderGetLock() { static OPENTELEMETRY_NAMESPACE::common::SpinLockMutex lock; return lock; } // - trace provider -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr &OpenTelemetryTraceProviderGetProvider() +__declspec(dllexport) +OPENTELEMETRY_NAMESPACE::nostd::shared_ptr & +OpenTelemetryTraceProviderGetProvider() { - static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr provider(new OPENTELEMETRY_NAMESPACE::trace::NoopTracerProvider); + static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr + provider(new OPENTELEMETRY_NAMESPACE::trace::NoopTracerProvider); return provider; } -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex &OpenTelemetryTraceProviderGetLock() +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex & +OpenTelemetryTraceProviderGetLock() { static OPENTELEMETRY_NAMESPACE::common::SpinLockMutex lock; return lock; } // - trace_state -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr OpenTelemetryTraceTraceStateGetDefault() +__declspec(dllexport) +OPENTELEMETRY_NAMESPACE::nostd::shared_ptr +OpenTelemetryTraceTraceStateGetDefault() { return OPENTELEMETRY_NAMESPACE::trace::detail::AbiBridgePrivacyIntruder::GetDefaultTraceState(); } - } diff --git a/api/src/symbol_bridge_window.cc b/api/src/symbol_bridge_window.cc deleted file mode 100644 index 31c75a70be..0000000000 --- a/api/src/symbol_bridge_window.cc +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -#define OPENTELEMETRY_SYMBOL_BRIDGE_IMPL -#include "opentelemetry/common/detail/symbol_bridge_windows.h" diff --git a/ci/do_ci.ps1 b/ci/do_ci.ps1 index 33dace3e73..bbee7b2812 100644 --- a/ci/do_ci.ps1 +++ b/ci/do_ci.ps1 @@ -85,6 +85,7 @@ switch ($action) { if ($exit -ne 0) { exit $exit } + $env:PATH = FindAndMergeDllPath "$BUILD_DIR\api\Debug" ctest -C Debug $exit = $LASTEXITCODE if ($exit -ne 0) { From 874cc2db784a7f0f5d1834af18d696f78972ff6d Mon Sep 17 00:00:00 2001 From: Desp4 Date: Sun, 4 Oct 2026 00:27:49 +0300 Subject: [PATCH 06/11] bring win pipeline env up to date --- ci/do_ci.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/do_ci.ps1 b/ci/do_ci.ps1 index bbee7b2812..bf94b0bb9e 100644 --- a/ci/do_ci.ps1 +++ b/ci/do_ci.ps1 @@ -107,7 +107,7 @@ switch ($action) { if ($exit -ne 0) { exit $exit } - $env:PATH = FindAndMergeDllPath "$BUILD_DIR\ext\src\dll\Debug" + $env:PATH = FindAndMergeDllPath "$BUILD_DIR\ext\src\dll\Debug", "$BUILD_DIR\api\Debug" ctest -C Debug $exit = $LASTEXITCODE if ($exit -ne 0) { @@ -130,7 +130,7 @@ switch ($action) { if ($exit -ne 0) { exit $exit } - $env:PATH = FindAndMergeDllPath "$BUILD_DIR\ext\src\dll\Debug" + $env:PATH = FindAndMergeDllPath "$BUILD_DIR\ext\src\dll\Debug", "$BUILD_DIR\api\Debug" ctest -C Debug $exit = $LASTEXITCODE if ($exit -ne 0) { From da62861ac36ef2f9f83c2d25085e6b1bd54ff317 Mon Sep 17 00:00:00 2001 From: Desp4 Date: Sun, 4 Oct 2026 17:13:45 +0300 Subject: [PATCH 07/11] update formatting --- api/CMakeLists.txt | 34 +++++------ .../common/detail/symbol_bridge_windows.h | 3 +- .../symbol_bridge_implementation_windows.cc | 57 +++++++++---------- 3 files changed, 48 insertions(+), 46 deletions(-) diff --git a/api/CMakeLists.txt b/api/CMakeLists.txt index a45ae3cd33..386b8144cc 100644 --- a/api/CMakeLists.txt +++ b/api/CMakeLists.txt @@ -11,23 +11,25 @@ set_target_properties(opentelemetry_api PROPERTIES EXPORT_NAME api) set(EXPORTED_OTELCPP_TARGETS opentelemetry_api) if(WIN32) - # - abi_symbol_bridge - add_library(opentelemetry_api_symbol_bridge SHARED src/symbol_bridge_implementation_windows.cc) - target_link_libraries(opentelemetry_api_symbol_bridge PRIVATE opentelemetry_api) - set_target_properties(opentelemetry_api_symbol_bridge PROPERTIES - EXPORT_NAME api_symbol_bridge - RUNTIME_OUTPUT_NAME opentelemetry_api_symbol_bridge - ) - - target_compile_options(opentelemetry_api_symbol_bridge PRIVATE - $<$:/wd4190> - $<$:-Wno-return-type-c-linkage> - ) - target_link_options(opentelemetry_api_symbol_bridge INTERFACE + # * abi_symbol_bridge + add_library(opentelemetry_api_symbol_bridge SHARED + src/symbol_bridge_implementation_windows.cc) + target_link_libraries(opentelemetry_api_symbol_bridge + PRIVATE opentelemetry_api) + set_target_properties( + opentelemetry_api_symbol_bridge + PROPERTIES EXPORT_NAME api_symbol_bridge RUNTIME_OUTPUT_NAME + opentelemetry_api_symbol_bridge) + + target_compile_options( + opentelemetry_api_symbol_bridge + PRIVATE $<$:/wd4190> + $<$:-Wno-return-type-c-linkage>) + target_link_options( + opentelemetry_api_symbol_bridge INTERFACE $<$:/INCLUDE:OpenTelemetryAbiBridgeHook> - $<$:-Wl,-u,OpenTelemetryAbiBridgeHook> - ) - + $<$:-Wl,-u,OpenTelemetryAbiBridgeHook>) + list(APPEND EXPORTED_OTELCPP_TARGETS opentelemetry_api_symbol_bridge) endif() diff --git a/api/include/opentelemetry/common/detail/symbol_bridge_windows.h b/api/include/opentelemetry/common/detail/symbol_bridge_windows.h index a3460d8e12..1f50161671 100644 --- a/api/include/opentelemetry/common/detail/symbol_bridge_windows.h +++ b/api/include/opentelemetry/common/detail/symbol_bridge_windows.h @@ -45,7 +45,8 @@ inline #endif #if !defined(OPENTELEMETRY_SYMBOL_BRIDGE_NOINLINE) || defined(OPENTELEMETRY_SYMBOL_BRIDGE_IMPL) - LoadedBridgeSymbol LoadSymbolBridgeSymbol(const char *symbol_name) noexcept + LoadedBridgeSymbol + LoadSymbolBridgeSymbol(const char *symbol_name) noexcept { struct ModuleLifetime { diff --git a/api/src/symbol_bridge_implementation_windows.cc b/api/src/symbol_bridge_implementation_windows.cc index a03208cb5a..1616dbeb3f 100644 --- a/api/src/symbol_bridge_implementation_windows.cc +++ b/api/src/symbol_bridge_implementation_windows.cc @@ -69,8 +69,8 @@ extern "C" { __declspec(dllexport) void OpenTelemetryAbiBridgeHook() {} // - baggage -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr -OpenTelemetryBaggageBaggageGetDefault() +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr< + opentelemetry::baggage::Baggage> OpenTelemetryBaggageBaggageGetDefault() { static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr baggage{ new OPENTELEMETRY_NAMESPACE::baggage::Baggage()}; @@ -79,33 +79,32 @@ OpenTelemetryBaggageBaggageGetDefault() // - runtime_context __declspec(dllexport) -OPENTELEMETRY_NAMESPACE::nostd::shared_ptr & -OpenTelemetryContextRuntimeContextGetStorage() + OPENTELEMETRY_NAMESPACE::nostd::shared_ptr + &OpenTelemetryContextRuntimeContextGetStorage() { static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr context(OPENTELEMETRY_NAMESPACE::context::GetDefaultStorage()); return context; } -__declspec(dllexport) -OPENTELEMETRY_NAMESPACE::context::detail::AbiBridgePrivacyIntruder::ThreadLocalContextStorageStack & -OpenTelemetryContextThreadLocalContextStorageStackGetStack() +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::context::detail::AbiBridgePrivacyIntruder:: + ThreadLocalContextStorageStack &OpenTelemetryContextThreadLocalContextStorageStackGetStack() { return OPENTELEMETRY_NAMESPACE::context::detail::AbiBridgePrivacyIntruder:: GetThreadLocalContextStorageStack(); } // - global_propagator -__declspec(dllexport) -OPENTELEMETRY_NAMESPACE::nostd::shared_ptr & -OpenTelemetryContextPropagationGlobalTextMapPropagatorGetPropagator() +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr< + opentelemetry::context::propagation::TextMapPropagator> + &OpenTelemetryContextPropagationGlobalTextMapPropagatorGetPropagator() { static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr< opentelemetry::context::propagation::TextMapPropagator> propagator(new OPENTELEMETRY_NAMESPACE::context::propagation::NoOpPropagator()); return propagator; } -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex & -OpenTelemetryContextPropagationGlobalTextMapPropagatorGetLock() +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex + &OpenTelemetryContextPropagationGlobalTextMapPropagatorGetLock() { static OPENTELEMETRY_NAMESPACE::common::SpinLockMutex lock; return lock; @@ -113,8 +112,8 @@ OpenTelemetryContextPropagationGlobalTextMapPropagatorGetLock() // - logs provider __declspec(dllexport) -OPENTELEMETRY_NAMESPACE::nostd::shared_ptr & -OpenTelemetryLogsProviderGetProvider() + OPENTELEMETRY_NAMESPACE::nostd::shared_ptr + &OpenTelemetryLogsProviderGetProvider() { static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr provider(new OPENTELEMETRY_NAMESPACE::logs::NoopLoggerProvider); @@ -122,8 +121,9 @@ OpenTelemetryLogsProviderGetProvider() } #if OPENTELEMETRY_ABI_VERSION_NO < 2 -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr< - OPENTELEMETRY_NAMESPACE::logs::EventLoggerProvider> &OpenTelemetryLogsProviderGetEventProvider() +__declspec(dllexport) + OPENTELEMETRY_NAMESPACE::nostd::shared_ptr + &OpenTelemetryLogsProviderGetEventProvider() { static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr< OPENTELEMETRY_NAMESPACE::logs::EventLoggerProvider> @@ -132,8 +132,8 @@ __declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr< } #endif -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex & -OpenTelemetryLogsProviderGetLock() +__declspec(dllexport) + OPENTELEMETRY_NAMESPACE::common::SpinLockMutex &OpenTelemetryLogsProviderGetLock() { static OPENTELEMETRY_NAMESPACE::common::SpinLockMutex lock; return lock; @@ -141,15 +141,15 @@ OpenTelemetryLogsProviderGetLock() // - metrics provider __declspec(dllexport) -OPENTELEMETRY_NAMESPACE::nostd::shared_ptr & -OpenTelemetryMetricsProviderGetProvider() + OPENTELEMETRY_NAMESPACE::nostd::shared_ptr + &OpenTelemetryMetricsProviderGetProvider() { static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr provider(new OPENTELEMETRY_NAMESPACE::metrics::NoopMeterProvider); return provider; } -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex & -OpenTelemetryMetricsProviderGetLock() +__declspec(dllexport) + OPENTELEMETRY_NAMESPACE::common::SpinLockMutex &OpenTelemetryMetricsProviderGetLock() { static OPENTELEMETRY_NAMESPACE::common::SpinLockMutex lock; return lock; @@ -157,25 +157,24 @@ OpenTelemetryMetricsProviderGetLock() // - trace provider __declspec(dllexport) -OPENTELEMETRY_NAMESPACE::nostd::shared_ptr & -OpenTelemetryTraceProviderGetProvider() + OPENTELEMETRY_NAMESPACE::nostd::shared_ptr + &OpenTelemetryTraceProviderGetProvider() { static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr provider(new OPENTELEMETRY_NAMESPACE::trace::NoopTracerProvider); return provider; } -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex & -OpenTelemetryTraceProviderGetLock() +__declspec(dllexport) + OPENTELEMETRY_NAMESPACE::common::SpinLockMutex &OpenTelemetryTraceProviderGetLock() { static OPENTELEMETRY_NAMESPACE::common::SpinLockMutex lock; return lock; } // - trace_state -__declspec(dllexport) -OPENTELEMETRY_NAMESPACE::nostd::shared_ptr -OpenTelemetryTraceTraceStateGetDefault() +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr< + OPENTELEMETRY_NAMESPACE::trace::TraceState> OpenTelemetryTraceTraceStateGetDefault() { return OPENTELEMETRY_NAMESPACE::trace::detail::AbiBridgePrivacyIntruder::GetDefaultTraceState(); } From b398f2086ed0ef8b94fcdf2066fde6765155f70e Mon Sep 17 00:00:00 2001 From: Desp4 Date: Mon, 5 Oct 2026 23:52:35 +0300 Subject: [PATCH 08/11] update formatting again, add missing path to win ci script --- .../symbol_bridge_implementation_windows.cc | 52 ++++++++++--------- ci/do_ci.ps1 | 2 +- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/api/src/symbol_bridge_implementation_windows.cc b/api/src/symbol_bridge_implementation_windows.cc index 1616dbeb3f..dbebc38a7d 100644 --- a/api/src/symbol_bridge_implementation_windows.cc +++ b/api/src/symbol_bridge_implementation_windows.cc @@ -69,8 +69,8 @@ extern "C" { __declspec(dllexport) void OpenTelemetryAbiBridgeHook() {} // - baggage -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr< - opentelemetry::baggage::Baggage> OpenTelemetryBaggageBaggageGetDefault() +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr +OpenTelemetryBaggageBaggageGetDefault() { static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr baggage{ new OPENTELEMETRY_NAMESPACE::baggage::Baggage()}; @@ -79,32 +79,33 @@ __declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr< // - runtime_context __declspec(dllexport) - OPENTELEMETRY_NAMESPACE::nostd::shared_ptr - &OpenTelemetryContextRuntimeContextGetStorage() +OPENTELEMETRY_NAMESPACE::nostd::shared_ptr & +OpenTelemetryContextRuntimeContextGetStorage() { static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr context(OPENTELEMETRY_NAMESPACE::context::GetDefaultStorage()); return context; } -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::context::detail::AbiBridgePrivacyIntruder:: - ThreadLocalContextStorageStack &OpenTelemetryContextThreadLocalContextStorageStackGetStack() +__declspec(dllexport) +OPENTELEMETRY_NAMESPACE::context::detail::AbiBridgePrivacyIntruder::ThreadLocalContextStorageStack & +OpenTelemetryContextThreadLocalContextStorageStackGetStack() { return OPENTELEMETRY_NAMESPACE::context::detail::AbiBridgePrivacyIntruder:: GetThreadLocalContextStorageStack(); } // - global_propagator -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr< - opentelemetry::context::propagation::TextMapPropagator> - &OpenTelemetryContextPropagationGlobalTextMapPropagatorGetPropagator() +__declspec(dllexport) +OPENTELEMETRY_NAMESPACE::nostd::shared_ptr & +OpenTelemetryContextPropagationGlobalTextMapPropagatorGetPropagator() { static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr< opentelemetry::context::propagation::TextMapPropagator> propagator(new OPENTELEMETRY_NAMESPACE::context::propagation::NoOpPropagator()); return propagator; } -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex - &OpenTelemetryContextPropagationGlobalTextMapPropagatorGetLock() +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex & +OpenTelemetryContextPropagationGlobalTextMapPropagatorGetLock() { static OPENTELEMETRY_NAMESPACE::common::SpinLockMutex lock; return lock; @@ -122,8 +123,8 @@ __declspec(dllexport) #if OPENTELEMETRY_ABI_VERSION_NO < 2 __declspec(dllexport) - OPENTELEMETRY_NAMESPACE::nostd::shared_ptr - &OpenTelemetryLogsProviderGetEventProvider() +OPENTELEMETRY_NAMESPACE::nostd::shared_ptr & +OpenTelemetryLogsProviderGetEventProvider() { static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr< OPENTELEMETRY_NAMESPACE::logs::EventLoggerProvider> @@ -132,8 +133,8 @@ __declspec(dllexport) } #endif -__declspec(dllexport) - OPENTELEMETRY_NAMESPACE::common::SpinLockMutex &OpenTelemetryLogsProviderGetLock() +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex & +OpenTelemetryLogsProviderGetLock() { static OPENTELEMETRY_NAMESPACE::common::SpinLockMutex lock; return lock; @@ -141,15 +142,15 @@ __declspec(dllexport) // - metrics provider __declspec(dllexport) - OPENTELEMETRY_NAMESPACE::nostd::shared_ptr - &OpenTelemetryMetricsProviderGetProvider() +OPENTELEMETRY_NAMESPACE::nostd::shared_ptr & +OpenTelemetryMetricsProviderGetProvider() { static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr provider(new OPENTELEMETRY_NAMESPACE::metrics::NoopMeterProvider); return provider; } -__declspec(dllexport) - OPENTELEMETRY_NAMESPACE::common::SpinLockMutex &OpenTelemetryMetricsProviderGetLock() +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex & +OpenTelemetryMetricsProviderGetLock() { static OPENTELEMETRY_NAMESPACE::common::SpinLockMutex lock; return lock; @@ -157,24 +158,25 @@ __declspec(dllexport) // - trace provider __declspec(dllexport) - OPENTELEMETRY_NAMESPACE::nostd::shared_ptr - &OpenTelemetryTraceProviderGetProvider() +OPENTELEMETRY_NAMESPACE::nostd::shared_ptr & +OpenTelemetryTraceProviderGetProvider() { static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr provider(new OPENTELEMETRY_NAMESPACE::trace::NoopTracerProvider); return provider; } -__declspec(dllexport) - OPENTELEMETRY_NAMESPACE::common::SpinLockMutex &OpenTelemetryTraceProviderGetLock() +__declspec(dllexport) OPENTELEMETRY_NAMESPACE::common::SpinLockMutex & +OpenTelemetryTraceProviderGetLock() { static OPENTELEMETRY_NAMESPACE::common::SpinLockMutex lock; return lock; } // - trace_state -__declspec(dllexport) OPENTELEMETRY_NAMESPACE::nostd::shared_ptr< - OPENTELEMETRY_NAMESPACE::trace::TraceState> OpenTelemetryTraceTraceStateGetDefault() +__declspec(dllexport) +OPENTELEMETRY_NAMESPACE::nostd::shared_ptr +OpenTelemetryTraceTraceStateGetDefault() { return OPENTELEMETRY_NAMESPACE::trace::detail::AbiBridgePrivacyIntruder::GetDefaultTraceState(); } diff --git a/ci/do_ci.ps1 b/ci/do_ci.ps1 index bf94b0bb9e..33ae1816d3 100644 --- a/ci/do_ci.ps1 +++ b/ci/do_ci.ps1 @@ -323,7 +323,7 @@ switch ($action) { if ($exit -ne 0) { exit $exit } - $env:PATH = FindAndMergeDllPath "$BUILD_DIR\ext\src\dll\Debug", "$BUILD_DIR\Debug" + $env:PATH = FindAndMergeDllPath "$BUILD_DIR\ext\src\dll\Debug", "$BUILD_DIR\api\Debug" ctest -C Debug $exit = $LASTEXITCODE if ($exit -ne 0) { From e8f3a230cd1818989afb6e4c0ae42dd1fc3a7a37 Mon Sep 17 00:00:00 2001 From: Desp4 Date: Mon, 5 Oct 2026 23:57:07 +0300 Subject: [PATCH 09/11] update formatting --- api/src/symbol_bridge_implementation_windows.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/symbol_bridge_implementation_windows.cc b/api/src/symbol_bridge_implementation_windows.cc index dbebc38a7d..a4c5df5e91 100644 --- a/api/src/symbol_bridge_implementation_windows.cc +++ b/api/src/symbol_bridge_implementation_windows.cc @@ -113,8 +113,8 @@ OpenTelemetryContextPropagationGlobalTextMapPropagatorGetLock() // - logs provider __declspec(dllexport) - OPENTELEMETRY_NAMESPACE::nostd::shared_ptr - &OpenTelemetryLogsProviderGetProvider() +OPENTELEMETRY_NAMESPACE::nostd::shared_ptr & +OpenTelemetryLogsProviderGetProvider() { static OPENTELEMETRY_NAMESPACE::nostd::shared_ptr provider(new OPENTELEMETRY_NAMESPACE::logs::NoopLoggerProvider); From e8eb23de4a8b2384accc75e2e83ef93e3bcd2fbf Mon Sep 17 00:00:00 2001 From: Desp4 Date: Mon, 5 Oct 2026 23:59:53 +0300 Subject: [PATCH 10/11] update ci script --- ci/do_ci.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/do_ci.ps1 b/ci/do_ci.ps1 index 33ae1816d3..3281a07bc9 100644 --- a/ci/do_ci.ps1 +++ b/ci/do_ci.ps1 @@ -323,7 +323,7 @@ switch ($action) { if ($exit -ne 0) { exit $exit } - $env:PATH = FindAndMergeDllPath "$BUILD_DIR\ext\src\dll\Debug", "$BUILD_DIR\api\Debug" + $env:PATH = FindAndMergeDllPath "$BUILD_DIR\ext\src\dll\Debug", "$BUILD_DIR\Debug", "$BUILD_DIR\api\Debug" ctest -C Debug $exit = $LASTEXITCODE if ($exit -ne 0) { From 6e67e758433779285f6ea963059ad016bb3058d8 Mon Sep 17 00:00:00 2001 From: Desp4 Date: Sat, 10 Oct 2026 21:00:28 +0300 Subject: [PATCH 11/11] fix PeriodicExportingMetricReader hanging in ExtDllInstallTest --- install/test/src/test_ext_dll.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/install/test/src/test_ext_dll.cc b/install/test/src/test_ext_dll.cc index ed8c1b9941..3e2c63cde8 100644 --- a/install/test/src/test_ext_dll.cc +++ b/install/test/src/test_ext_dll.cc @@ -113,4 +113,5 @@ TEST(ExtDllInstallTest, MeterProviderCheck) ASSERT_TRUE(counter != nullptr); counter->Add(1); } -} \ No newline at end of file + metrics::Provider::SetMeterProvider({}); +}