diff --git a/dtool/src/dtoolbase/atomicAdjust.h b/dtool/src/dtoolbase/atomicAdjust.h index 6ce85c3589..9dc7832e46 100644 --- a/dtool/src/dtoolbase/atomicAdjust.h +++ b/dtool/src/dtoolbase/atomicAdjust.h @@ -39,14 +39,19 @@ typedef AtomicAdjustI386Impl AtomicAdjust; #define HAVE_ATOMIC_COMPARE_AND_EXCHANGE 1 #define HAVE_ATOMIC_COMPARE_AND_EXCHANGE_PTR 1 -#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) +#elif (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))) || (defined(__clang__) && (__clang_major__ >= 3)) // GCC 4.7 and above has built-in __atomic functions for atomic operations. +// Clang 3.0 and above also supports them. #include "atomicAdjustGccImpl.h" typedef AtomicAdjustGccImpl AtomicAdjust; +#if (__GCC_ATOMIC_INT_LOCK_FREE + __GCC_ATOMIC_INT_LOCK_FREE) > 0 #define HAVE_ATOMIC_COMPARE_AND_EXCHANGE 1 +#endif +#if __GCC_ATOMIC_POINTER_LOCK_FREE > 0 #define HAVE_ATOMIC_COMPARE_AND_EXCHANGE_PTR 1 +#endif #elif defined(THREAD_WIN32_IMPL) diff --git a/dtool/src/dtoolbase/atomicAdjustGccImpl.I b/dtool/src/dtoolbase/atomicAdjustGccImpl.I index 6831a16a1e..3e462f01cf 100644 --- a/dtool/src/dtoolbase/atomicAdjustGccImpl.I +++ b/dtool/src/dtoolbase/atomicAdjustGccImpl.I @@ -125,7 +125,7 @@ compare_and_exchange(TVOLATILE AtomicAdjustGccImpl::Integer &mem, AtomicAdjustGccImpl::Integer old_value, AtomicAdjustGccImpl::Integer new_value) { - __atomic_compare_exchange_n(&mem, &old_value, new_value, false, + __atomic_compare_exchange_n(&mem, &old_value, new_value, true, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); return old_value; } @@ -142,7 +142,7 @@ compare_and_exchange_ptr(TVOLATILE AtomicAdjustGccImpl::Pointer &mem, AtomicAdjustGccImpl::Pointer old_value, AtomicAdjustGccImpl::Pointer new_value) { - __atomic_compare_exchange_n(&mem, &old_value, new_value, false, + __atomic_compare_exchange_n(&mem, &old_value, new_value, true, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); return old_value; } diff --git a/dtool/src/dtoolbase/atomicAdjustGccImpl.h b/dtool/src/dtoolbase/atomicAdjustGccImpl.h index 2c8003948d..2059addbbe 100644 --- a/dtool/src/dtoolbase/atomicAdjustGccImpl.h +++ b/dtool/src/dtoolbase/atomicAdjustGccImpl.h @@ -18,7 +18,7 @@ #include "dtoolbase.h" #include "selectThreadImpl.h" -#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) +#if (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))) || (defined(__clang__) && (__clang_major__ >= 3)) //////////////////////////////////////////////////////////////////// // Class : AtomicAdjustGccImpl