From 86e3a51f0b12dded33a35fc1b5ab5b49f0af56d2 Mon Sep 17 00:00:00 2001 From: Duron27 Date: Tue, 24 Mar 2026 01:04:40 -0400 Subject: [PATCH 1/3] Refactor atomic operations for Android compatibility Updated atomic operations to use std::atomic for Android platform. --- include/OpenThreads/Atomic | 53 ++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/include/OpenThreads/Atomic b/include/OpenThreads/Atomic index ba6723354e8..c0176c7a4d0 100644 --- a/include/OpenThreads/Atomic +++ b/include/OpenThreads/Atomic @@ -17,7 +17,9 @@ #include #include -#if defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) +#if defined(__ANDROID__) +# include +#elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) # include # define _OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES #elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) && defined(__i386__) @@ -61,10 +63,12 @@ class OPENTHREAD_EXPORT_DIRECTIVE Atomic { Atomic(const Atomic&); Atomic& operator=(const Atomic&); -#if defined(_OPENTHREADS_ATOMIC_USE_MUTEX) +#if defined(_OPENTHREADS_ATOMIC_USE_MUTEX) && !defined(__ANDROID__) mutable Mutex _mutex; #endif -#if defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) +#if defined(__ANDROID__) + std::atomic _value; +#elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) volatile long _value; #elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) volatile int32_t _value; @@ -95,10 +99,14 @@ private: AtomicPtr(const AtomicPtr&); AtomicPtr& operator=(const AtomicPtr&); -#if defined(_OPENTHREADS_ATOMIC_USE_MUTEX) +#if defined(_OPENTHREADS_ATOMIC_USE_MUTEX) && !defined(__ANDROID__) mutable Mutex _mutex; #endif +#if defined(__ANDROID__) + std::atomic _ptr; +#else void* volatile _ptr; +#endif }; #if !defined(_OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES) @@ -106,7 +114,9 @@ private: _OPENTHREADS_ATOMIC_INLINE unsigned Atomic::operator++() { -#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(__ANDROID__) + return ++_value; +#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_add_and_fetch(&_value, 1); #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) return __add_and_fetch(&_value, 1); @@ -123,7 +133,9 @@ Atomic::operator++() _OPENTHREADS_ATOMIC_INLINE unsigned Atomic::operator--() { -#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(__ANDROID__) + return --_value; +#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_sub_and_fetch(&_value, 1); #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) return __sub_and_fetch(&_value, 1); @@ -140,7 +152,9 @@ Atomic::operator--() _OPENTHREADS_ATOMIC_INLINE unsigned Atomic::AND(unsigned value) { -#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(__ANDROID__) + return (_value &= value); +#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_fetch_and_and(&_value, value); #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) return __and_and_fetch(&_value, value); @@ -159,7 +173,9 @@ Atomic::AND(unsigned value) _OPENTHREADS_ATOMIC_INLINE unsigned Atomic::OR(unsigned value) { -#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(__ANDROID__) + return (_value |= value); +#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_fetch_and_or(&_value, value); #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) return __or_and_fetch(&_value, value); @@ -178,7 +194,9 @@ Atomic::OR(unsigned value) _OPENTHREADS_ATOMIC_INLINE unsigned Atomic::XOR(unsigned value) { -#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(__ANDROID__) + return (_value ^= value); +#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_fetch_and_xor(&_value, value); #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) return __xor_and_fetch(&_value, value); @@ -199,7 +217,9 @@ Atomic::XOR(unsigned value) _OPENTHREADS_ATOMIC_INLINE unsigned Atomic::exchange(unsigned value) { -#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(__ANDROID__) + return _value.exchange(value); +#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_lock_test_and_set(&_value, value); #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) return __compare_and_swap(&_value, _value, value); @@ -220,7 +240,9 @@ Atomic::exchange(unsigned value) _OPENTHREADS_ATOMIC_INLINE Atomic::operator unsigned() const { -#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(__ANDROID__) + return _value; +#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) __sync_synchronize(); return _value; #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) @@ -240,7 +262,10 @@ Atomic::operator unsigned() const _OPENTHREADS_ATOMIC_INLINE bool AtomicPtr::assign(void* ptrNew, const void* const ptrOld) { -#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(__ANDROID__) + void *old = (void*) ptrOld; + return _ptr.compare_exchange_strong(old, ptrNew); +#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_bool_compare_and_swap(&_ptr, (void *)ptrOld, ptrNew); #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) return __compare_and_swap((unsigned long*)&_ptr, (unsigned long)ptrOld, (unsigned long)ptrNew); @@ -263,7 +288,9 @@ AtomicPtr::assign(void* ptrNew, const void* const ptrOld) _OPENTHREADS_ATOMIC_INLINE void* AtomicPtr::get() const { -#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(__ANDROID__) + return _ptr; +#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) __sync_synchronize(); return _ptr; #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) From 1c8cb9c582008b501e3e9043a07709d7c78a931d Mon Sep 17 00:00:00 2001 From: Duron27 Date: Tue, 24 Mar 2026 21:33:22 -0400 Subject: [PATCH 2/3] Switch from __ANDROID__ defines to _OPENTHREADS_ATOMIC_USE_STD_ATOMIC --- CMakeLists.txt | 12 ++++---- CMakeModules/CheckAtomicOps.cmake | 46 ++++++++++++++++++++++++++----- include/OpenThreads/Atomic | 28 +++++++++---------- src/OpenThreads/CMakeLists.txt | 4 +-- src/OpenThreads/common/Atomic.cpp | 37 +++++++++++++++++++------ src/OpenThreads/common/Config.in | 1 + 6 files changed, 89 insertions(+), 39 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b77fb64a10f..fbd709ecef9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -314,7 +314,7 @@ INCLUDE_DIRECTORIES(SYSTEM ${OPENGL_INCLUDE_DIR}) IF(WIN32 AND NOT ANDROID) - OPTION(OSG_DETERMINE_WIN_VERSION "Wheter to automatically determine current Windows version" ON) + OPTION(OSG_DETERMINE_WIN_VERSION "Whether to automatically determine current Windows version" ON) IF(OSG_DETERMINE_WIN_VERSION) # Check window version @@ -352,7 +352,7 @@ IF(WIN32 AND NOT ANDROID) OPTION(MSVC_DISABLE_CHECKED_ITERATORS "Set to ON to disable Visual C++ checked iterators. If you do this you must ensure that every other project in your solution and all dependencies are compiled with _SECURE_SCL=0." OFF) MARK_AS_ADVANCED(MSVC_DISABLE_CHECKED_ITERATORS) IF(MSVC_DISABLE_CHECKED_ITERATORS) - ADD_DEFINITIONS(-D_ITERATOR_DEBUG_LEVEL=0) # this supercedes _SECURE_SCL and _HAS_ITERATOR_DEBUGGING in VS2010 and forward + ADD_DEFINITIONS(-D_ITERATOR_DEBUG_LEVEL=0) # this supersedes _SECURE_SCL and _HAS_ITERATOR_DEBUGGING in VS2010 and forward ADD_DEFINITIONS(-D_SECURE_SCL=0) ADD_DEFINITIONS(-D_HAS_ITERATOR_DEBUGGING=0) ENDIF() @@ -429,7 +429,7 @@ ENDIF() OPTION(OSG_NOTIFY_DISABLED "Set to ON to build OpenSceneGraph with the notify() disabled." OFF) -OPTION(OSG_USE_DEPRECATED_API "Set to ON to build OpenSceneGraph with the OSG_USE_DEPREFATED_API #define enabled to allow access to deprecated APIs ." ON) +OPTION(OSG_USE_DEPRECATED_API "Set to ON to build OpenSceneGraph with the OSG_USE_DEPRECATED_API #define enabled to allow access to deprecated APIs ." ON) OPTION(OSG_USE_FLOAT_MATRIX "Set to ON to build OpenSceneGraph with float Matrix instead of double." OFF) MARK_AS_ADVANCED(OSG_USE_FLOAT_MATRIX) @@ -598,7 +598,7 @@ ELSE() ENDIF() ENDIF() -SET(OSG_GL_CONTEXT_VERSION ${DEFAULT_GL_CONTEXT_VERSION} CACHE STRING "GL Context String to pass when creaing graphics contexts") +SET(OSG_GL_CONTEXT_VERSION ${DEFAULT_GL_CONTEXT_VERSION} CACHE STRING "GL Context String to pass when creating graphics contexts") IF (OSG_GL1_AVAILABLE) SET(OSG_GL1_FEATURES 1) @@ -941,7 +941,7 @@ SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} CACHE STRING "You may add additiona SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} CACHE STRING "You may add additional search paths here. Use ; to separate multiple paths.") # We are proposing that a new variable called CMAKE_PREFIX_PATH be introduced # to CMake to compliment CMAKE_INCLUDE_PATH and CMAKE_LIBRARY_PATH. -# A formal feature request has been submited to CMake, Bug #4947. +# A formal feature request has been submitted to CMake, Bug #4947. # It is intended for those users who have common prefixes for their INCLUDE # and LIBRARY locations. So if users have headers in /usr/local/include # and libraries in /usr/local/lib, the common prefix is /usr/local. @@ -1135,7 +1135,7 @@ ENDIF() INCLUDE(${CMAKE_ROOT}/Modules/Documentation.cmake OPTIONAL) OPTION(BUILD_DOCUMENTATION "Build OpenSceneGraph reference documentation using doxygen (use: make doc_openscenegraph doc_openthreads)" OFF) MARK_AS_ADVANCED(CLEAR BUILD_DOCUMENTATION) -# To build the documention, you will have to enable it +# To build the documentation, you will have to enable it # and then do the equivalent of "make doc_openscenegraph doc_openthreads". IF(BUILD_DOCUMENTATION) diff --git a/CMakeModules/CheckAtomicOps.cmake b/CMakeModules/CheckAtomicOps.cmake index 11ddae56667..256aa27be02 100644 --- a/CMakeModules/CheckAtomicOps.cmake +++ b/CMakeModules/CheckAtomicOps.cmake @@ -6,6 +6,7 @@ OPTION(OPENTHREADS_ATOMIC_USE_MUTEX "Set to ON to force OpenThreads to use a mut IF (OPENTHREADS_ATOMIC_USE_MUTEX) + SET(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC 0) SET(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS 0) SET(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS 0) SET(_OPENTHREADS_ATOMIC_USE_SUN 0) @@ -17,6 +18,7 @@ IF (OPENTHREADS_ATOMIC_USE_MUTEX) ELSE() # as the test does not work for IOS hardcode the ATOMIC implementation IF(OSG_BUILD_PLATFORM_IPHONE_SIMULATOR OR OSG_BUILD_PLATFORM_IPHONE) + SET(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC 0) SET(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS 0) SET(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS 0) SET(_OPENTHREADS_ATOMIC_USE_SUN 0) @@ -26,10 +28,36 @@ ELSE() SET(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC 1) ELSE() - INCLUDE(CheckCXXSourceRuns) + INCLUDE(CheckCXXSourceCompiles) # Do step by step checking, - CHECK_CXX_SOURCE_RUNS(" + check_cxx_source_compiles(" + #include + #include + + int main() + { + std::atomic value{0}; + std::atomic ptr{nullptr}; + value.fetch_add(1, std::memory_order_acq_rel); + std::atomic_thread_fence(std::memory_order_seq_cst); + value.fetch_sub(1, std::memory_order_acq_rel); + unsigned expected = 0; + + if (!value.compare_exchange_strong(expected, 1)) + return EXIT_FAILURE; + + void* expected_ptr = nullptr; + void* new_ptr = &value; + + if (!ptr.compare_exchange_strong(expected_ptr, new_ptr)) + return EXIT_FAILURE; + + return EXIT_SUCCESS; + } + " _OPENTHREADS_ATOMIC_USE_STD_ATOMIC) + + check_cxx_source_compiles(" #include int main() @@ -49,7 +77,7 @@ ELSE() } " _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) - CHECK_CXX_SOURCE_RUNS(" + check_cxx_source_compiles(" #include int main(int, const char**) @@ -69,7 +97,7 @@ ELSE() } " _OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) - CHECK_CXX_SOURCE_RUNS(" + check_cxx_source_compiles(" #include #include @@ -90,7 +118,7 @@ ELSE() } " _OPENTHREADS_ATOMIC_USE_SUN) - CHECK_CXX_SOURCE_RUNS(" + check_cxx_source_compiles(" #include #include #include @@ -119,7 +147,7 @@ ELSE() } " _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) - CHECK_CXX_SOURCE_RUNS(" + check_cxx_source_compiles(" #include int main() @@ -136,7 +164,8 @@ ELSE() } " _OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) - IF(NOT _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS AND + IF(NOT _OPENTHREADS_ATOMIC_USE_STD_ATOMIC AND + NOT _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS AND NOT _OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS AND NOT _OPENTHREADS_ATOMIC_USE_SUN AND NOT _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED AND @@ -150,6 +179,9 @@ ELSE() # In this case we prefer the GCC_BUILTINS SET(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS 1) SET(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED 0) + ELSEIF (_OPENTHREADS_ATOMIC_USE_STD_ATOMIC AND _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) + SET(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC 1) + SET(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED 0) ENDIF() ENDIF() diff --git a/include/OpenThreads/Atomic b/include/OpenThreads/Atomic index c0176c7a4d0..c4630f808c5 100644 --- a/include/OpenThreads/Atomic +++ b/include/OpenThreads/Atomic @@ -17,7 +17,7 @@ #include #include -#if defined(__ANDROID__) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) # include #elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) # include @@ -63,10 +63,10 @@ class OPENTHREAD_EXPORT_DIRECTIVE Atomic { Atomic(const Atomic&); Atomic& operator=(const Atomic&); -#if defined(_OPENTHREADS_ATOMIC_USE_MUTEX) && !defined(__ANDROID__) +#if defined(_OPENTHREADS_ATOMIC_USE_MUTEX) mutable Mutex _mutex; #endif -#if defined(__ANDROID__) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) std::atomic _value; #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) volatile long _value; @@ -99,10 +99,10 @@ private: AtomicPtr(const AtomicPtr&); AtomicPtr& operator=(const AtomicPtr&); -#if defined(_OPENTHREADS_ATOMIC_USE_MUTEX) && !defined(__ANDROID__) +#if defined(_OPENTHREADS_ATOMIC_USE_MUTEX) mutable Mutex _mutex; #endif -#if defined(__ANDROID__) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) std::atomic _ptr; #else void* volatile _ptr; @@ -114,7 +114,7 @@ private: _OPENTHREADS_ATOMIC_INLINE unsigned Atomic::operator++() { -#if defined(__ANDROID__) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) return ++_value; #elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_add_and_fetch(&_value, 1); @@ -133,7 +133,7 @@ Atomic::operator++() _OPENTHREADS_ATOMIC_INLINE unsigned Atomic::operator--() { -#if defined(__ANDROID__) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) return --_value; #elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_sub_and_fetch(&_value, 1); @@ -152,7 +152,7 @@ Atomic::operator--() _OPENTHREADS_ATOMIC_INLINE unsigned Atomic::AND(unsigned value) { -#if defined(__ANDROID__) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) return (_value &= value); #elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_fetch_and_and(&_value, value); @@ -173,7 +173,7 @@ Atomic::AND(unsigned value) _OPENTHREADS_ATOMIC_INLINE unsigned Atomic::OR(unsigned value) { -#if defined(__ANDROID__) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) return (_value |= value); #elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_fetch_and_or(&_value, value); @@ -194,7 +194,7 @@ Atomic::OR(unsigned value) _OPENTHREADS_ATOMIC_INLINE unsigned Atomic::XOR(unsigned value) { -#if defined(__ANDROID__) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) return (_value ^= value); #elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_fetch_and_xor(&_value, value); @@ -217,7 +217,7 @@ Atomic::XOR(unsigned value) _OPENTHREADS_ATOMIC_INLINE unsigned Atomic::exchange(unsigned value) { -#if defined(__ANDROID__) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) return _value.exchange(value); #elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_lock_test_and_set(&_value, value); @@ -240,7 +240,7 @@ Atomic::exchange(unsigned value) _OPENTHREADS_ATOMIC_INLINE Atomic::operator unsigned() const { -#if defined(__ANDROID__) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) return _value; #elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) __sync_synchronize(); @@ -262,7 +262,7 @@ Atomic::operator unsigned() const _OPENTHREADS_ATOMIC_INLINE bool AtomicPtr::assign(void* ptrNew, const void* const ptrOld) { -#if defined(__ANDROID__) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) void *old = (void*) ptrOld; return _ptr.compare_exchange_strong(old, ptrNew); #elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) @@ -288,7 +288,7 @@ AtomicPtr::assign(void* ptrNew, const void* const ptrOld) _OPENTHREADS_ATOMIC_INLINE void* AtomicPtr::get() const { -#if defined(__ANDROID__) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) return _ptr; #elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) __sync_synchronize(); diff --git a/src/OpenThreads/CMakeLists.txt b/src/OpenThreads/CMakeLists.txt index 67013568831..4406b6a88e1 100644 --- a/src/OpenThreads/CMakeLists.txt +++ b/src/OpenThreads/CMakeLists.txt @@ -9,9 +9,7 @@ SET(OPENTHREADS_SOVERSION 21) SET(OPENTHREADS_VERSION ${OPENTHREADS_MAJOR_VERSION}.${OPENTHREADS_MINOR_VERSION}.${OPENTHREADS_PATCH_VERSION}) -IF(NOT ANDROID) - INCLUDE(CheckAtomicOps) -ENDIF() +INCLUDE(CheckAtomicOps) # User Options OPTION(DYNAMIC_OPENTHREADS "Set to ON to build OpenThreads for dynamic linking. Use OFF for static." ON) diff --git a/src/OpenThreads/common/Atomic.cpp b/src/OpenThreads/common/Atomic.cpp index 21c336435ff..9d7f39e50f8 100644 --- a/src/OpenThreads/common/Atomic.cpp +++ b/src/OpenThreads/common/Atomic.cpp @@ -40,7 +40,9 @@ namespace OpenThreads { unsigned Atomic::operator++() { -#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) + return ++_value; +#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_add_and_fetch(&_value, 1); #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) return InterlockedIncrement(&_value); @@ -54,7 +56,9 @@ Atomic::operator++() unsigned Atomic::operator--() { -#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) + return --_value; +#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_sub_and_fetch(&_value, 1); #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) return InterlockedDecrement(&_value); @@ -68,7 +72,9 @@ Atomic::operator--() unsigned Atomic::AND(unsigned value) { -#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) + return (_value &= value); +#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_fetch_and_and(&_value, value); #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) return _InterlockedAnd(&_value, value); @@ -82,7 +88,9 @@ Atomic::AND(unsigned value) unsigned Atomic::OR(unsigned value) { -#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) + return (_value |= value); +#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_fetch_and_or(&_value, value); #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) return _InterlockedOr(&_value, value); @@ -96,7 +104,9 @@ Atomic::OR(unsigned value) unsigned Atomic::XOR(unsigned value) { -#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) + return (_value ^= value); +#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_fetch_and_xor(&_value, value); #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) return _InterlockedXor(&_value, value); @@ -111,7 +121,9 @@ Atomic::XOR(unsigned value) unsigned Atomic::exchange(unsigned value) { -#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) + return _value.exchange(value); +#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_lock_test_and_set(&_value, value); #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) return InterlockedExchange(&_value, value); @@ -125,7 +137,9 @@ Atomic::exchange(unsigned value) Atomic::operator unsigned() const { -#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) + return _value; +#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) __sync_synchronize(); return _value; #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) @@ -142,7 +156,10 @@ Atomic::operator unsigned() const bool AtomicPtr::assign(void* ptrNew, const void* const ptrOld) { -#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) + void *old = (void*) ptrOld; + return _ptr.compare_exchange_strong(old, ptrNew); +#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_bool_compare_and_swap(&_ptr, (void*)ptrOld, ptrNew); #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) return ptrOld == InterlockedCompareExchangePointer((PVOID volatile*)&_ptr, (PVOID)ptrNew, (PVOID)ptrOld); @@ -156,7 +173,9 @@ AtomicPtr::assign(void* ptrNew, const void* const ptrOld) void* AtomicPtr::get() const { -#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) + return _ptr; +#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) __sync_synchronize(); return _ptr; #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) diff --git a/src/OpenThreads/common/Config.in b/src/OpenThreads/common/Config.in index 6406457d371..4fbc7e60315 100644 --- a/src/OpenThreads/common/Config.in +++ b/src/OpenThreads/common/Config.in @@ -23,6 +23,7 @@ #ifndef _OPENTHREADS_CONFIG #define _OPENTHREADS_CONFIG +#cmakedefine _OPENTHREADS_ATOMIC_USE_STD_ATOMIC #cmakedefine _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS #cmakedefine _OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS #cmakedefine _OPENTHREADS_ATOMIC_USE_SUN From c2497a57f44d73f8ee03f9ee9f7239a5fc5d7201 Mon Sep 17 00:00:00 2001 From: Duron27 Date: Thu, 26 Mar 2026 07:22:22 -0400 Subject: [PATCH 3/3] Rollback Atomic changes to Atomic.cpp --- src/OpenThreads/common/Atomic.cpp | 39 ++++++++----------------------- 1 file changed, 10 insertions(+), 29 deletions(-) diff --git a/src/OpenThreads/common/Atomic.cpp b/src/OpenThreads/common/Atomic.cpp index 9d7f39e50f8..8d3267eaf94 100644 --- a/src/OpenThreads/common/Atomic.cpp +++ b/src/OpenThreads/common/Atomic.cpp @@ -40,9 +40,7 @@ namespace OpenThreads { unsigned Atomic::operator++() { -#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) - return ++_value; -#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_add_and_fetch(&_value, 1); #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) return InterlockedIncrement(&_value); @@ -56,9 +54,7 @@ Atomic::operator++() unsigned Atomic::operator--() { -#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) - return --_value; -#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_sub_and_fetch(&_value, 1); #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) return InterlockedDecrement(&_value); @@ -72,9 +68,7 @@ Atomic::operator--() unsigned Atomic::AND(unsigned value) { -#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) - return (_value &= value); -#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_fetch_and_and(&_value, value); #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) return _InterlockedAnd(&_value, value); @@ -88,9 +82,7 @@ Atomic::AND(unsigned value) unsigned Atomic::OR(unsigned value) { -#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) - return (_value |= value); -#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_fetch_and_or(&_value, value); #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) return _InterlockedOr(&_value, value); @@ -104,9 +96,7 @@ Atomic::OR(unsigned value) unsigned Atomic::XOR(unsigned value) { -#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) - return (_value ^= value); -#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_fetch_and_xor(&_value, value); #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) return _InterlockedXor(&_value, value); @@ -121,9 +111,7 @@ Atomic::XOR(unsigned value) unsigned Atomic::exchange(unsigned value) { -#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) - return _value.exchange(value); -#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_lock_test_and_set(&_value, value); #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) return InterlockedExchange(&_value, value); @@ -137,9 +125,7 @@ Atomic::exchange(unsigned value) Atomic::operator unsigned() const { -#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) - return _value; -#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) __sync_synchronize(); return _value; #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) @@ -156,10 +142,7 @@ Atomic::operator unsigned() const bool AtomicPtr::assign(void* ptrNew, const void* const ptrOld) { -#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) - void *old = (void*) ptrOld; - return _ptr.compare_exchange_strong(old, ptrNew); -#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) return __sync_bool_compare_and_swap(&_ptr, (void*)ptrOld, ptrNew); #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) return ptrOld == InterlockedCompareExchangePointer((PVOID volatile*)&_ptr, (PVOID)ptrNew, (PVOID)ptrOld); @@ -173,9 +156,7 @@ AtomicPtr::assign(void* ptrNew, const void* const ptrOld) void* AtomicPtr::get() const { -#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) - return _ptr; -#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) +#if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) __sync_synchronize(); return _ptr; #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) @@ -191,4 +172,4 @@ AtomicPtr::get() const #endif // defined(_OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES) -} +} \ No newline at end of file