Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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)

Expand Down
46 changes: 39 additions & 7 deletions CMakeModules/CheckAtomicOps.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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 <atomic>
#include <cstdlib>
int main()
{
std::atomic<unsigned> value{0};
std::atomic<void*> 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 <cstdlib>
int main()
Expand All @@ -49,7 +77,7 @@ ELSE()
}
" _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS)

CHECK_CXX_SOURCE_RUNS("
check_cxx_source_compiles("
#include <stdlib.h>
int main(int, const char**)
Expand All @@ -69,7 +97,7 @@ ELSE()
}
" _OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS)

CHECK_CXX_SOURCE_RUNS("
check_cxx_source_compiles("
#include <atomic.h>
#include <cstdlib>
Expand All @@ -90,7 +118,7 @@ ELSE()
}
" _OPENTHREADS_ATOMIC_USE_SUN)

CHECK_CXX_SOURCE_RUNS("
check_cxx_source_compiles("
#include <windows.h>
#include <intrin.h>
#include <cstdlib>
Expand Down Expand Up @@ -119,7 +147,7 @@ ELSE()
}
" _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED)

CHECK_CXX_SOURCE_RUNS("
check_cxx_source_compiles("
#include <libkern/OSAtomic.h>
int main()
Expand All @@ -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
Expand All @@ -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()
Expand Down
49 changes: 38 additions & 11 deletions include/OpenThreads/Atomic
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@
#include <OpenThreads/Config>
#include <OpenThreads/Exports>

#if defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC)
#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC)
# include <atomic>
#elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC)
# include <libkern/OSAtomic.h>
# define _OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES
#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) && defined(__i386__)
Expand Down Expand Up @@ -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<unsigned> _value;
#elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED)
volatile long _value;
#elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC)
volatile int32_t _value;
Expand Down Expand Up @@ -98,15 +102,21 @@ private:
#if defined(_OPENTHREADS_ATOMIC_USE_MUTEX)
mutable Mutex _mutex;
#endif
#if defined(_OPENTHREADS_ATOMIC_USE_STD_ATOMIC)
std::atomic<void*> _ptr;
#else
void* volatile _ptr;
#endif
};

#if !defined(_OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES)

_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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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)
Expand All @@ -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);
Expand All @@ -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)
Expand Down
4 changes: 1 addition & 3 deletions src/OpenThreads/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion src/OpenThreads/common/Atomic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -172,4 +172,4 @@ AtomicPtr::get() const

#endif // defined(_OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES)

}
}
1 change: 1 addition & 0 deletions src/OpenThreads/common/Config.in
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down