16 #ifndef epicsAtomicCD_h 17 #define epicsAtomicCD_h 20 # error this header is only for use with the gnu compiler 23 #define EPICS_ATOMIC_CMPLR_NAME "GCC" 25 #define GCC_ATOMIC_CONCAT( A, B ) GCC_ATOMIC_CONCATR(A,B) 26 #define GCC_ATOMIC_CONCATR( A, B ) ( A ## B ) 28 #define GCC_ATOMIC_INTRINSICS_AVAIL_INT_T \ 30 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_, \ 33 #define GCC_ATOMIC_INTRINSICS_AVAIL_SIZE_T \ 35 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_, \ 38 #define GCC_ATOMIC_INTRINSICS_MIN_X86 \ 39 ( defined ( __i486 ) || defined ( __pentium ) || \ 40 defined ( __pentiumpro ) || defined ( __MMX__ ) ) 42 #define GCC_ATOMIC_INTRINSICS_GCC4_OR_BETTER \ 43 ( ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 401 ) 45 #define GCC_ATOMIC_INTRINSICS_AVAIL_EARLIER \ 46 ( GCC_ATOMIC_INTRINSICS_MIN_X86 && \ 47 GCC_ATOMIC_INTRINSICS_GCC4_OR_BETTER ) 68 #if GCC_ATOMIC_INTRINSICS_GCC4_OR_BETTER 70 #ifndef EPICS_ATOMIC_READ_MEMORY_BARRIER 71 #define EPICS_ATOMIC_READ_MEMORY_BARRIER 74 __sync_synchronize ();
78 #ifndef EPICS_ATOMIC_WRITE_MEMORY_BARRIER 79 #define EPICS_ATOMIC_WRITE_MEMORY_BARRIER 82 __sync_synchronize ();
88 #ifndef EPICS_ATOMIC_READ_MEMORY_BARRIER 89 #if GCC_ATOMIC_INTRINSICS_MIN_X86 90 #define EPICS_ATOMIC_READ_MEMORY_BARRIER 98 #ifndef EPICS_ATOMIC_WRITE_MEMORY_BARRIER 99 #if GCC_ATOMIC_INTRINSICS_MIN_X86 100 #define EPICS_ATOMIC_WRITE_MEMORY_BARRIER 110 #if GCC_ATOMIC_INTRINSICS_AVAIL_INT_T \ 111 || GCC_ATOMIC_INTRINSICS_AVAIL_EARLIER 113 #define EPICS_ATOMIC_INCR_INTT 116 return __sync_add_and_fetch ( pTarget, 1 );
119 #define EPICS_ATOMIC_DECR_INTT 122 return __sync_sub_and_fetch ( pTarget, 1 );
125 #define EPICS_ATOMIC_ADD_INTT 128 return __sync_add_and_fetch ( pTarget, delta );
131 #define EPICS_ATOMIC_CAS_INTT 133 int oldVal,
int newVal )
135 return __sync_val_compare_and_swap ( pTarget, oldVal, newVal);
140 #if GCC_ATOMIC_INTRINSICS_AVAIL_SIZE_T \ 141 || GCC_ATOMIC_INTRINSICS_AVAIL_EARLIER 143 #define EPICS_ATOMIC_INCR_SIZET 146 return __sync_add_and_fetch ( pTarget, 1u );
149 #define EPICS_ATOMIC_DECR_SIZET 152 return __sync_sub_and_fetch ( pTarget, 1u );
155 #define EPICS_ATOMIC_ADD_SIZET 158 return __sync_add_and_fetch ( pTarget, delta );
161 #define EPICS_ATOMIC_SUB_SIZET 164 return __sync_sub_and_fetch ( pTarget, delta );
167 #define EPICS_ATOMIC_CAS_SIZET 169 size_t oldVal,
size_t newVal )
171 return __sync_val_compare_and_swap ( pTarget, oldVal, newVal);
174 #define EPICS_ATOMIC_CAS_PTRT 179 return __sync_val_compare_and_swap ( pTarget, oldVal, newVal);
192 #include "epicsAtomicOSD.h" EPICS_ATOMIC_INLINE size_t epicsAtomicCmpAndSwapSizeT(size_t *pTarget, size_t oldVal, size_t newVal)
EPICS_ATOMIC_INLINE size_t epicsAtomicSubSizeT(size_t *pTarget, size_t delta)
EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier(void)
EPICS_ATOMIC_INLINE int epicsAtomicCmpAndSwapIntT(int *pTarget, int oldVal, int newVal)
EPICS_ATOMIC_INLINE size_t epicsAtomicAddSizeT(size_t *pTarget, size_t delta)
EPICS_ATOMIC_INLINE size_t epicsAtomicDecrSizeT(size_t *pTarget)
#define EPICS_ATOMIC_INLINE
EPICS_ATOMIC_INLINE EpicsAtomicPtrT epicsAtomicCmpAndSwapPtrT(EpicsAtomicPtrT *pTarget, EpicsAtomicPtrT oldVal, EpicsAtomicPtrT newVal)
EPICS_ATOMIC_INLINE int epicsAtomicAddIntT(int *pTarget, int delta)
EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier(void)
EPICS_ATOMIC_INLINE int epicsAtomicDecrIntT(int *pTarget)
EPICS_ATOMIC_INLINE int epicsAtomicIncrIntT(int *pTarget)
EPICS_ATOMIC_INLINE size_t epicsAtomicIncrSizeT(size_t *pTarget)