diff -r 4accc35cbfcf Include/pyatomic.h --- a/Include/pyatomic.h Tue Mar 17 10:49:17 2015 +0100 +++ b/Include/pyatomic.h Tue Mar 17 12:10:27 2015 +0100 @@ -6,13 +6,16 @@ #include "pyconfig.h" +#if defined(HAVE_STD_ATOMIC) && defined(__cplusplus) +# include +#elif defined(HAVE_STD_ATOMIC) +# include +#endif + #ifdef __cplusplus extern "C" { #endif -#if defined(HAVE_STD_ATOMIC) -#include -#endif /* This is modeled after the atomics interface from C1x, according to * the draft at @@ -23,7 +26,32 @@ extern "C" { * Beware, the implementations here are deep magic. */ -#if defined(HAVE_STD_ATOMIC) +/* Use C++ */ +#if defined(HAVE_STD_ATOMIC) && defined(__cplusplus) + +#define _Py_memory_order_relaxed std::memory_order_relaxed +#define _Py_memory_order_acquire std::memory_order_acquire +#define _Py_memory_order_release std::memory_order_release +#define _Py_memory_order_acq_rel std::memory_order_acq_rel +#define _Py_memory_order_seq_cst std::memory_order_seq_cst + +typedef std::atomic _Py_atomic_address; +typedef std::atomic _Py_atomic_int; + +#define _Py_atomic_signal_fence(/*memory_order*/ ORDER) \ + std::atomic_signal_fence(ORDER) + +#define _Py_atomic_thread_fence(/*memory_order*/ ORDER) \ + std::atomic_thread_fence(ORDER) + +#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ + std::atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) + +#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ + std::atomic_load_explicit(ATOMIC_VAL, ORDER) + +/* Use */ +#elif defined(HAVE_STD_ATOMIC) typedef enum _Py_memory_order { _Py_memory_order_relaxed = memory_order_relaxed,