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 ba6723354e8..c4630f808c5 100644 --- a/include/OpenThreads/Atomic +++ b/include/OpenThreads/Atomic @@ -17,7 +17,9 @@ #include #include -#if defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) +# include +#elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) # include # define _OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES #elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) && defined(__i386__) @@ -64,7 +66,9 @@ class OPENTHREAD_EXPORT_DIRECTIVE Atomic { #if defined(_OPENTHREADS_ATOMIC_USE_MUTEX) mutable Mutex _mutex; #endif -#if defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) + std::atomic _value; +#elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) volatile long _value; #elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) volatile int32_t _value; @@ -98,7 +102,11 @@ private: #if defined(_OPENTHREADS_ATOMIC_USE_MUTEX) mutable Mutex _mutex; #endif +#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) + 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(_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_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(_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_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(_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_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(_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_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(_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_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(_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_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(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) + 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(_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_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(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC) + return _ptr; +#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) __sync_synchronize(); return _ptr; #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) 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..8d3267eaf94 100644 --- a/src/OpenThreads/common/Atomic.cpp +++ b/src/OpenThreads/common/Atomic.cpp @@ -172,4 +172,4 @@ AtomicPtr::get() const #endif // defined(_OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES) -} +} \ No newline at end of file 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