summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimothy Simpson <simpsont@objectcomputing.com>2021-08-26 12:52:39 -0500
committerTimothy Simpson <simpsont@objectcomputing.com>2021-08-26 12:52:39 -0500
commit615284ae6d9ca661bd1f644b042003dd8e161f30 (patch)
tree42e586ae93332a310e5e06cdd04ad95449b2329e
parentc04bb36209f697dab1f0f46a2868f4f43a5bfe29 (diff)
downloadATCD-615284ae6d9ca661bd1f644b042003dd8e161f30.tar.gz
make use of clang's compatibility with GCC's __atomic methods
-rw-r--r--ACE/ace/Atomic_Op_GCC_T.inl39
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 */