diff options
author | Timothy Simpson <simpsont@objectcomputing.com> | 2021-08-26 12:52:39 -0500 |
---|---|---|
committer | Timothy Simpson <simpsont@objectcomputing.com> | 2021-08-26 12:52:39 -0500 |
commit | 615284ae6d9ca661bd1f644b042003dd8e161f30 (patch) | |
tree | 42e586ae93332a310e5e06cdd04ad95449b2329e | |
parent | c04bb36209f697dab1f0f46a2868f4f43a5bfe29 (diff) | |
download | ATCD-615284ae6d9ca661bd1f644b042003dd8e161f30.tar.gz |
make use of clang's compatibility with GCC's __atomic methods
-rw-r--r-- | ACE/ace/Atomic_Op_GCC_T.inl | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/ACE/ace/Atomic_Op_GCC_T.inl b/ACE/ace/Atomic_Op_GCC_T.inl index 8e36045f5f8..adc637e7a71 100644 --- a/ACE/ace/Atomic_Op_GCC_T.inl +++ b/ACE/ace/Atomic_Op_GCC_T.inl @@ -1,6 +1,11 @@ // -*- C++ -*- #if defined (ACE_HAS_GCC_ATOMIC_BUILTINS) && (ACE_HAS_GCC_ATOMIC_BUILTINS == 1) +#if (defined (__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))) \ + || (defined (__clang__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 3))) +# define USE_GCC_CPP11_ATOMICS +#endif + ACE_BEGIN_VERSIONED_NAMESPACE_DECL template <typename T> @@ -29,7 +34,7 @@ template <typename T> ACE_INLINE T ACE_Atomic_Op_GCC<T>::operator++ (void) { -#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) +#if defined (USE_GCC_CPP11_ATOMICS) return __atomic_add_fetch (&value_, 1, __ATOMIC_ACQ_REL); #else return __sync_add_and_fetch (&value_, 1); @@ -40,7 +45,7 @@ template <typename T> ACE_INLINE T ACE_Atomic_Op_GCC<T>::operator++ (int) { -#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) +#if defined (USE_GCC_CPP11_ATOMICS) return __atomic_fetch_add (&value_, 1, __ATOMIC_ACQ_REL); #else return __sync_fetch_and_add (&value_, 1); @@ -51,7 +56,7 @@ template <typename T> ACE_INLINE T ACE_Atomic_Op_GCC<T>::operator-- (void) { -#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) +#if defined (USE_GCC_CPP11_ATOMICS) return __atomic_sub_fetch (&value_, 1, __ATOMIC_ACQ_REL); #else return __sync_sub_and_fetch (&value_, 1); @@ -62,7 +67,7 @@ template <typename T> ACE_INLINE T ACE_Atomic_Op_GCC<T>::operator-- (int) { -#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) +#if defined (USE_GCC_CPP11_ATOMICS) return __atomic_fetch_sub (&value_, 1, __ATOMIC_ACQ_REL); #else return __sync_fetch_and_sub (&value_, 1); @@ -73,7 +78,7 @@ template <typename T> ACE_INLINE T ACE_Atomic_Op_GCC<T>::operator+= (T rhs) { -#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) +#if defined (USE_GCC_CPP11_ATOMICS) return __atomic_add_fetch (&value_, rhs, __ATOMIC_ACQ_REL); #else return __sync_add_and_fetch (&value_, rhs); @@ -84,7 +89,7 @@ template <typename T> ACE_INLINE T ACE_Atomic_Op_GCC<T>::operator-= (T rhs) { -#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) +#if defined (USE_GCC_CPP11_ATOMICS) return __atomic_sub_fetch (&value_, rhs, __ATOMIC_ACQ_REL); #else return __sync_sub_and_fetch (&value_, rhs); @@ -95,7 +100,7 @@ template <typename T> ACE_INLINE bool ACE_Atomic_Op_GCC<T>::operator== (T rhs) const { -#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) +#if defined (USE_GCC_CPP11_ATOMICS) return __atomic_load_n (&value_, __ATOMIC_CONSUME) == rhs; #else __sync_synchronize(); @@ -107,7 +112,7 @@ template <typename T> ACE_INLINE bool ACE_Atomic_Op_GCC<T>::operator!= (T rhs) const { -#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) +#if defined (USE_GCC_CPP11_ATOMICS) return __atomic_load_n (&value_, __ATOMIC_CONSUME) != rhs; #else __sync_synchronize(); @@ -119,7 +124,7 @@ template <typename T> ACE_INLINE bool ACE_Atomic_Op_GCC<T>::operator>= (T rhs) const { -#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) +#if defined (USE_GCC_CPP11_ATOMICS) return __atomic_load_n (&value_, __ATOMIC_CONSUME) >= rhs; #else __sync_synchronize(); @@ -131,7 +136,7 @@ template <typename T> ACE_INLINE bool ACE_Atomic_Op_GCC<T>::operator> (T rhs) const { -#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) +#if defined (USE_GCC_CPP11_ATOMICS) return __atomic_load_n (&value_, __ATOMIC_CONSUME) > rhs; #else __sync_synchronize(); @@ -143,7 +148,7 @@ template <typename T> ACE_INLINE bool ACE_Atomic_Op_GCC<T>::operator<= (T rhs) const { -#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) +#if defined (USE_GCC_CPP11_ATOMICS) return __atomic_load_n (&value_, __ATOMIC_CONSUME) <= rhs; #else __sync_synchronize(); @@ -155,7 +160,7 @@ template <typename T> ACE_INLINE bool ACE_Atomic_Op_GCC<T>::operator< (T rhs) const { -#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) +#if defined (USE_GCC_CPP11_ATOMICS) return __atomic_load_n (&value_, __ATOMIC_CONSUME) < rhs; #else __sync_synchronize(); @@ -167,7 +172,7 @@ template <typename T> ACE_INLINE ACE_Atomic_Op_GCC<T> & ACE_Atomic_Op_GCC<T>::operator= (T rhs) { -#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) +#if defined (USE_GCC_CPP11_ATOMICS) __atomic_store_n (&value_, rhs, __ATOMIC_RELEASE); #else (void) __sync_lock_test_and_set (&value_, rhs); @@ -180,7 +185,7 @@ ACE_INLINE ACE_Atomic_Op_GCC<T> & ACE_Atomic_Op_GCC<T>::operator= ( const ACE_Atomic_Op_GCC<T> &rhs) { -#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) +#if defined (USE_GCC_CPP11_ATOMICS) __atomic_store_n (&value_, __atomic_load_n (&rhs.value_, __ATOMIC_CONSUME), __ATOMIC_RELEASE); #else (void) __sync_lock_test_and_set (&value_, rhs.value_); @@ -192,7 +197,7 @@ template <typename T> ACE_INLINE T ACE_Atomic_Op_GCC<T>::exchange (T newval) { -#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) +#if defined (USE_GCC_CPP11_ATOMICS) return __atomic_exchange_n (&value_, newval, __ATOMIC_ACQ_REL); #else return __sync_val_compare_and_swap (&value_, value_, newval); @@ -203,7 +208,7 @@ template <typename T> ACE_INLINE T ACE_Atomic_Op_GCC<T>::value (void) const { -#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) +#if defined (USE_GCC_CPP11_ATOMICS) return __atomic_load_n (&value_, __ATOMIC_CONSUME); #else __sync_synchronize(); @@ -218,6 +223,8 @@ ACE_Atomic_Op_GCC<T>::value_i (void) return value_; } +#undef USE_GCC_CPP11_ATOMICS + ACE_END_VERSIONED_NAMESPACE_DECL #endif /* ACE_HAS_GCC_ATOMIC_BUILTINS */ |