From 26e3873f708ab30ae0580c0a6b6b81345fc5f7a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20K=C3=B6ppe?= Date: Wed, 1 Jul 2015 09:55:25 +0100 Subject: [PATCH] Add C++11 support to atomic_counter_t. --- src/atomic_counter.hpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/atomic_counter.hpp b/src/atomic_counter.hpp index bceb8347..7c55d0b8 100644 --- a/src/atomic_counter.hpp +++ b/src/atomic_counter.hpp @@ -37,6 +37,8 @@ #define ZMQ_ATOMIC_COUNTER_MUTEX #elif defined ZMQ_HAVE_ATOMIC_INTRINSICS #define ZMQ_ATOMIC_INTRINSIC +#elif (defined ZMQ_CXX11 && defined __cplusplus && __cplusplus >= 201103L) +#define ZMQ_ATOMIC_COUNTER_CXX11 #elif (defined __i386__ || defined __x86_64__) && defined __GNUC__ #define ZMQ_ATOMIC_COUNTER_X86 #elif defined __ARM_ARCH_7A__ && defined __GNUC__ @@ -53,6 +55,8 @@ #if defined ZMQ_ATOMIC_COUNTER_MUTEX #include "mutex.hpp" +#elif defined ZMQ_ATOMIC_COUNTER_CXX11 +#include #elif defined ZMQ_ATOMIC_COUNTER_WINDOWS #include "windows.hpp" #elif defined ZMQ_ATOMIC_COUNTER_ATOMIC_H @@ -97,6 +101,8 @@ namespace zmq old_value = InterlockedExchangeAdd ((LONG*) &value, increment_); #elif defined ZMQ_ATOMIC_INTRINSIC old_value = __atomic_fetch_add(&value, increment_, __ATOMIC_ACQ_REL); +#elif defined ZMQ_ATOMIC_COUNTER_CXX11 + old_value = value.fetch_add(increment_, std::memory_order_acq_rel); #elif defined ZMQ_ATOMIC_COUNTER_ATOMIC_H integer_t new_value = atomic_add_32_nv (&value, increment_); old_value = new_value - increment_; @@ -142,6 +148,9 @@ namespace zmq #elif defined ZMQ_ATOMIC_INTRINSIC integer_t nv = __atomic_sub_fetch(&value, decrement, __ATOMIC_ACQ_REL); return nv != 0; +#elif defined ZMQ_ATOMIC_COUNTER_CXX11 + integer_t old = value.fetch_sub(decrement, std::memory_order_acq_rel); + return old - decrement != 0; #elif defined ZMQ_ATOMIC_COUNTER_ATOMIC_H int32_t delta = - ((int32_t) decrement); integer_t nv = atomic_add_32_nv (&value, delta); @@ -190,13 +199,20 @@ namespace zmq private: +#if defined ZMQ_ATOMIC_COUNTER_CXX11 + std::atomic value; +#else volatile integer_t value; +#endif + #if defined ZMQ_ATOMIC_COUNTER_MUTEX mutex_t sync; #endif +#if ! defined ZMQ_ATOMIC_COUNTER_CXX11 atomic_counter_t (const atomic_counter_t&); const atomic_counter_t& operator = (const atomic_counter_t&); +#endif }; }