]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/frratomic.h
Merge pull request #5710 from opensourcerouting/fix_centos6
[mirror_frr.git] / lib / frratomic.h
index 1f1d1b569a59cfc60163c1c8085ff7c7c6dafe77..1e28253f2b2ea9e6c7688692dd5261a1b296b3ba 100644 (file)
 #endif
 
 /* ISO C11 */
-#ifdef HAVE_STDATOMIC_H
+#ifdef __cplusplus
+#include <stdint.h>
+#include <atomic>
+using std::atomic_int;
+using std::memory_order;
+using std::memory_order_relaxed;
+using std::memory_order_acquire;
+using std::memory_order_release;
+using std::memory_order_acq_rel;
+using std::memory_order_consume;
+using std::memory_order_seq_cst;
+
+typedef std::atomic<bool>              atomic_bool;
+typedef std::atomic<size_t>            atomic_size_t;
+typedef std::atomic<uint_fast32_t>     atomic_uint_fast32_t;
+
+#elif defined(HAVE_STDATOMIC_H)
 #include <stdatomic.h>
 
 /* These are available in gcc, but not in stdatomic */
@@ -39,6 +55,7 @@
 #elif defined(HAVE___ATOMIC)
 
 #define _Atomic volatile
+#define _ATOMIC_WANT_TYPEDEFS
 
 #define memory_order_relaxed __ATOMIC_RELAXED
 #define memory_order_consume __ATOMIC_CONSUME
@@ -63,6 +80,9 @@
 #define atomic_compare_exchange_weak_explicit(atom, expect, desire, mem1,      \
                                              mem2)                            \
        __atomic_compare_exchange_n(atom, expect, desire, 1, mem1, mem2)
+#define atomic_compare_exchange_strong_explicit(atom, expect, desire, mem1,    \
+                                             mem2)                            \
+       __atomic_compare_exchange_n(atom, expect, desire, 0, mem1, mem2)
 
 /* gcc 4.1 and newer,
  * clang 3.3 (possibly older)
@@ -74,6 +94,7 @@
 #elif defined(HAVE___SYNC)
 
 #define _Atomic volatile
+#define _ATOMIC_WANT_TYPEDEFS
 
 #define memory_order_relaxed 0
 #define memory_order_consume 0
                rval;                                                          \
        })
 
-#define atomic_compare_exchange_weak_explicit(atom, expect, desire, mem1,      \
+#define atomic_compare_exchange_strong_explicit(atom, expect, desire, mem1,    \
                                              mem2)                            \
        ({                                                                     \
                typeof(atom) _atom = (atom);                                   \
                *_expect = rval;                                               \
                ret;                                                           \
        })
+#define atomic_compare_exchange_weak_explicit \
+       atomic_compare_exchange_strong_explicit
 
 #define atomic_fetch_and_explicit(ptr, val, mem)                               \
        ({                                                                     \
 #error no atomic functions...
 #endif
 
+#ifdef _ATOMIC_WANT_TYPEDEFS
+#undef _ATOMIC_WANT_TYPEDEFS
+
+#include <stdint.h>
+#include <stdbool.h>
+
+typedef _Atomic bool           atomic_bool;
+typedef _Atomic size_t         atomic_size_t;
+typedef _Atomic uint_fast32_t  atomic_uint_fast32_t;
+#endif
+
 #endif /* _FRRATOMIC_H */