From 68f5926ec65d33043ba3f1687e49d1e6abe47fa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20K=C3=B6ppe?= Date: Tue, 30 Jun 2015 20:48:29 +0100 Subject: [PATCH] Add support for in C++11 --- src/atomic_ptr.hpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/atomic_ptr.hpp b/src/atomic_ptr.hpp index 14bc3741..846a292e 100644 --- a/src/atomic_ptr.hpp +++ b/src/atomic_ptr.hpp @@ -36,6 +36,8 @@ #define ZMQ_ATOMIC_PTR_MUTEX #elif defined ZMQ_HAVE_ATOMIC_INTRINSICS #define ZMQ_ATOMIC_PTR_INTRINSIC +#elif (defined ZMQ_CXX11 && defined __cplusplus && __cplusplus >= 201103L) +#define ZMQ_ATOMIC_CXX11 #elif (defined __i386__ || defined __x86_64__) && defined __GNUC__ #define ZMQ_ATOMIC_PTR_X86 #elif defined __ARM_ARCH_7A__ && defined __GNUC__ @@ -52,6 +54,8 @@ #if defined ZMQ_ATOMIC_PTR_MUTEX #include "mutex.hpp" +#elif defined ZMQ_ATOMIC_CXX11 +#include #elif defined ZMQ_ATOMIC_PTR_WINDOWS #include "windows.hpp" #elif defined ZMQ_ATOMIC_PTR_ATOMIC_H @@ -96,6 +100,8 @@ namespace zmq return (T*) InterlockedExchangePointer ((PVOID*) &ptr, val_); #elif defined ZMQ_ATOMIC_PTR_INTRINSIC return (T*) __atomic_exchange_n (&ptr, val_, __ATOMIC_ACQ_REL); +#elif defined ZMQ_ATOMIC_CXX11 + return ptr.exchange(val_, std::memory_order_acq_rel); #elif defined ZMQ_ATOMIC_PTR_ATOMIC_H return (T*) atomic_swap_ptr (&ptr, val_); #elif defined ZMQ_ATOMIC_PTR_TILE @@ -146,6 +152,9 @@ namespace zmq __atomic_compare_exchange_n (&ptr, (volatile T**) &old, val_, false, __ATOMIC_RELEASE, __ATOMIC_ACQUIRE); return old; +#elif defined ZMQ_ATOMIC_CXX11 + ptr.compare_exchange_strong(cmp_, val_); + return cmp_; #elif defined ZMQ_ATOMIC_PTR_ATOMIC_H return (T*) atomic_cas_ptr (&ptr, cmp_, val_); #elif defined ZMQ_ATOMIC_PTR_TILE @@ -189,13 +198,20 @@ namespace zmq private: +#if defined ZMQ_ATOMIC_CXX11 + std::atomic ptr; +#else volatile T *ptr; +#endif + #if defined ZMQ_ATOMIC_PTR_MUTEX mutex_t sync; #endif +#if ! defined ZMQ_ATOMIC_CXX11 atomic_ptr_t (const atomic_ptr_t&); const atomic_ptr_t &operator = (const atomic_ptr_t&); +#endif }; }