30 #ifndef __ZMQ_ATOMIC_PTR_HPP_INCLUDED__ 31 #define __ZMQ_ATOMIC_PTR_HPP_INCLUDED__ 33 #include "platform.hpp" 35 #if defined ZMQ_FORCE_MUTEXES 36 #define ZMQ_ATOMIC_PTR_MUTEX 37 #elif defined ZMQ_HAVE_ATOMIC_INTRINSICS 38 #define ZMQ_ATOMIC_PTR_INTRINSIC 39 #elif (defined ZMQ_CXX11 && defined __cplusplus && __cplusplus >= 201103L) 40 #define ZMQ_ATOMIC_PTR_CXX11 41 #elif (defined __i386__ || defined __x86_64__) && defined __GNUC__ 42 #define ZMQ_ATOMIC_PTR_X86 43 #elif defined __ARM_ARCH_7A__ && defined __GNUC__ 44 #define ZMQ_ATOMIC_PTR_ARM 45 #elif defined __tile__ 46 #define ZMQ_ATOMIC_PTR_TILE 47 #elif defined ZMQ_HAVE_WINDOWS 48 #define ZMQ_ATOMIC_PTR_WINDOWS 49 #elif (defined ZMQ_HAVE_SOLARIS || defined ZMQ_HAVE_NETBSD || defined ZMQ_HAVE_GNU) 50 #define ZMQ_ATOMIC_PTR_ATOMIC_H 52 #define ZMQ_ATOMIC_PTR_MUTEX 55 #if defined ZMQ_ATOMIC_PTR_MUTEX 57 #elif defined ZMQ_ATOMIC_PTR_CXX11 59 #elif defined ZMQ_ATOMIC_PTR_WINDOWS 61 #elif defined ZMQ_ATOMIC_PTR_ATOMIC_H 63 #elif defined ZMQ_ATOMIC_PTR_TILE 64 #include <arch/atomic.h> 90 inline void set (T *ptr_)
99 #if defined ZMQ_ATOMIC_PTR_WINDOWS 100 return (T*) InterlockedExchangePointer ((PVOID*) &
ptr, val_);
101 #elif defined ZMQ_ATOMIC_PTR_INTRINSIC 102 return (T*) __atomic_exchange_n (&
ptr, val_, __ATOMIC_ACQ_REL);
103 #elif defined ZMQ_ATOMIC_PTR_CXX11 104 return ptr.exchange(val_, std::memory_order_acq_rel);
105 #elif defined ZMQ_ATOMIC_PTR_ATOMIC_H 106 return (T*) atomic_swap_ptr (&
ptr, val_);
107 #elif defined ZMQ_ATOMIC_PTR_TILE 108 return (T*) arch_atomic_exchange (&
ptr, val_);
109 #elif defined ZMQ_ATOMIC_PTR_X86 113 :
"=r" (old),
"=m" (
ptr)
114 :
"m" (
ptr),
"0" (val_));
116 #elif defined ZMQ_ATOMIC_PTR_ARM 121 "1: ldrex %1, [%3]\n\t" 122 " strex %0, %4, [%3]\n\t" 126 :
"=&r"(flag),
"=&r"(old),
"+Qo"(
ptr)
127 :
"r"(&
ptr),
"r"(val_)
130 #elif defined ZMQ_ATOMIC_PTR_MUTEX 137 #error atomic_ptr is not implemented for this platform 145 inline T *
cas (T *cmp_, T *val_)
147 #if defined ZMQ_ATOMIC_PTR_WINDOWS 148 return (T*) InterlockedCompareExchangePointer (
149 (
volatile PVOID*) &
ptr, val_, cmp_);
150 #elif defined ZMQ_ATOMIC_PTR_INTRINSIC 152 __atomic_compare_exchange_n (&
ptr, (
volatile T**) &old, val_,
false,
153 __ATOMIC_RELEASE, __ATOMIC_ACQUIRE);
155 #elif defined ZMQ_ATOMIC_PTR_CXX11 156 ptr.compare_exchange_strong(cmp_, val_, std::memory_order_acq_rel);
158 #elif defined ZMQ_ATOMIC_PTR_ATOMIC_H 159 return (T*) atomic_cas_ptr (&
ptr, cmp_, val_);
160 #elif defined ZMQ_ATOMIC_PTR_TILE 161 return (T*) arch_atomic_val_compare_and_exchange (&
ptr, cmp_, val_);
162 #elif defined ZMQ_ATOMIC_PTR_X86 165 "lock; cmpxchg %2, %3" 166 :
"=a" (old),
"=m" (
ptr)
167 :
"r" (val_),
"m" (
ptr),
"0" (cmp_)
170 #elif defined ZMQ_ATOMIC_PTR_ARM 175 "1: ldrex %1, [%3]\n\t" 179 " strexeq %0, %5, [%3]\n\t" 183 :
"=&r"(flag),
"=&r"(old),
"+Qo"(
ptr)
184 :
"r"(&
ptr),
"r"(cmp_),
"r"(val_)
187 #elif defined ZMQ_ATOMIC_PTR_MUTEX 195 #error atomic_ptr is not implemented for this platform 201 #if defined ZMQ_ATOMIC_PTR_CXX11 207 #if defined ZMQ_ATOMIC_PTR_MUTEX 211 #if ! defined ZMQ_ATOMIC_PTR_CXX11 220 #undef ZMQ_ATOMIC_PTR_MUTEX 221 #undef ZMQ_ATOMIC_PTR_INTRINSIC 222 #undef ZMQ_ATOMIC_PTR_CXX11 223 #undef ZMQ_ATOMIC_PTR_X86 224 #undef ZMQ_ATOMIC_PTR_ARM 225 #undef ZMQ_ATOMIC_PTR_TILE 226 #undef ZMQ_ATOMIC_PTR_WINDOWS 227 #undef ZMQ_ATOMIC_PTR_ATOMIC_H const atomic_ptr_t & operator=(const atomic_ptr_t &)
T * cas(T *cmp_, T *val_)