30 #ifndef __ZMQ_ATOMIC_COUNTER_HPP_INCLUDED__ 31 #define __ZMQ_ATOMIC_COUNTER_HPP_INCLUDED__ 34 #include "platform.hpp" 36 #if defined ZMQ_FORCE_MUTEXES 37 #define ZMQ_ATOMIC_COUNTER_MUTEX 38 #elif defined ZMQ_HAVE_ATOMIC_INTRINSICS 39 #define ZMQ_ATOMIC_COUNTER_INTRINSIC 40 #elif (defined ZMQ_CXX11 && defined __cplusplus && __cplusplus >= 201103L) 41 #define ZMQ_ATOMIC_COUNTER_CXX11 42 #elif (defined __i386__ || defined __x86_64__) && defined __GNUC__ 43 #define ZMQ_ATOMIC_COUNTER_X86 44 #elif defined __ARM_ARCH_7A__ && defined __GNUC__ 45 #define ZMQ_ATOMIC_COUNTER_ARM 46 #elif defined ZMQ_HAVE_WINDOWS 47 #define ZMQ_ATOMIC_COUNTER_WINDOWS 48 #elif (defined ZMQ_HAVE_SOLARIS || defined ZMQ_HAVE_NETBSD || defined ZMQ_HAVE_GNU) 49 #define ZMQ_ATOMIC_COUNTER_ATOMIC_H 50 #elif defined __tile__ 51 #define ZMQ_ATOMIC_COUNTER_TILE 53 #define ZMQ_ATOMIC_COUNTER_MUTEX 56 #if defined ZMQ_ATOMIC_COUNTER_MUTEX 58 #elif defined ZMQ_ATOMIC_COUNTER_CXX11 60 #elif defined ZMQ_ATOMIC_COUNTER_WINDOWS 62 #elif defined ZMQ_ATOMIC_COUNTER_ATOMIC_H 64 #elif defined ZMQ_ATOMIC_COUNTER_TILE 65 #include <arch/atomic.h> 90 inline void set (integer_t value_)
96 inline integer_t
add (integer_t increment_)
100 #if defined ZMQ_ATOMIC_COUNTER_WINDOWS 101 old_value = InterlockedExchangeAdd ((LONG*) &
value, increment_);
102 #elif defined ZMQ_ATOMIC_COUNTER_INTRINSIC 103 old_value = __atomic_fetch_add(&
value, increment_, __ATOMIC_ACQ_REL);
104 #elif defined ZMQ_ATOMIC_COUNTER_CXX11 105 old_value =
value.fetch_add(increment_, std::memory_order_acq_rel);
106 #elif defined ZMQ_ATOMIC_COUNTER_ATOMIC_H 107 integer_t new_value = atomic_add_32_nv (&
value, increment_);
108 old_value = new_value - increment_;
109 #elif defined ZMQ_ATOMIC_COUNTER_TILE 110 old_value = arch_atomic_add (&
value, increment_);
111 #elif defined ZMQ_ATOMIC_COUNTER_X86 113 "lock; xadd %0, %1 \n\t" 114 :
"=r" (old_value),
"=m" (
value)
115 :
"0" (increment_),
"m" (
value)
117 #elif defined ZMQ_ATOMIC_COUNTER_ARM 121 "1: ldrex %0, [%5]\n\t" 122 " add %2, %0, %4\n\t" 123 " strex %1, %2, [%5]\n\t" 127 :
"=&r"(old_value),
"=&r"(flag),
"=&r"(tmp),
"+Qo"(
value)
128 :
"Ir"(increment_),
"r"(&
value)
130 #elif defined ZMQ_ATOMIC_COUNTER_MUTEX 136 #error atomic_counter is not implemented for this platform 142 inline bool sub (integer_t decrement)
144 #if defined ZMQ_ATOMIC_COUNTER_WINDOWS 145 LONG delta = - ((LONG) decrement);
146 integer_t old = InterlockedExchangeAdd ((LONG*) &
value, delta);
147 return old - decrement != 0;
148 #elif defined ZMQ_ATOMIC_COUNTER_INTRINSIC 149 integer_t nv = __atomic_sub_fetch(&
value, decrement, __ATOMIC_ACQ_REL);
151 #elif defined ZMQ_ATOMIC_COUNTER_CXX11 152 integer_t old =
value.fetch_sub(decrement, std::memory_order_acq_rel);
153 return old - decrement != 0;
154 #elif defined ZMQ_ATOMIC_COUNTER_ATOMIC_H 155 int32_t delta = - ((int32_t) decrement);
156 integer_t nv = atomic_add_32_nv (&
value, delta);
158 #elif defined ZMQ_ATOMIC_COUNTER_TILE 159 int32_t delta = - ((int32_t) decrement);
160 integer_t nv = arch_atomic_add (&
value, delta);
162 #elif defined ZMQ_ATOMIC_COUNTER_X86 163 integer_t oldval = -decrement;
164 volatile integer_t *val = &
value;
165 __asm__
volatile (
"lock; xaddl %0,%1" 166 :
"=r" (oldval),
"=m" (*val)
167 :
"0" (oldval),
"m" (*val)
169 return oldval != decrement;
170 #elif defined ZMQ_ATOMIC_COUNTER_ARM 171 integer_t old_value, flag, tmp;
174 "1: ldrex %0, [%5]\n\t" 175 " sub %2, %0, %4\n\t" 176 " strex %1, %2, [%5]\n\t" 180 :
"=&r"(old_value),
"=&r"(flag),
"=&r"(tmp),
"+Qo"(
value)
181 :
"Ir"(decrement),
"r"(&
value)
183 return old_value - decrement != 0;
184 #elif defined ZMQ_ATOMIC_COUNTER_MUTEX 187 bool result =
value ?
true :
false;
191 #error atomic_counter is not implemented for this platform 195 inline integer_t
get ()
const 202 #if defined ZMQ_ATOMIC_COUNTER_CXX11 203 std::atomic<integer_t>
value;
208 #if defined ZMQ_ATOMIC_COUNTER_MUTEX 212 #if ! defined ZMQ_ATOMIC_COUNTER_CXX11 221 #undef ZMQ_ATOMIC_COUNTER_MUTEX 222 #undef ZMQ_ATOMIC_COUNTER_INTRINSIC 223 #undef ZMQ_ATOMIC_COUNTER_CXX11 224 #undef ZMQ_ATOMIC_COUNTER_X86 225 #undef ZMQ_ATOMIC_COUNTER_ARM 226 #undef ZMQ_ATOMIC_COUNTER_WINDOWS 227 #undef ZMQ_ATOMIC_COUNTER_ATOMIC_H 228 #undef ZMQ_ATOMIC_COUNTER_TILE
atomic_counter_t(integer_t value_=0)
integer_t add(integer_t increment_)
bool sub(integer_t decrement)
const atomic_counter_t & operator=(const atomic_counter_t &)