20 #ifndef INC_epicsAtomicGCC_H
21 #define INC_epicsAtomicGCC_H
26 #define GCC_ATOMIC_CONCAT( A, B ) GCC_ATOMIC_CONCATR(A,B)
27 #define GCC_ATOMIC_CONCATR( A, B ) ( A ## B )
29 #define GCC_ATOMIC_INTRINSICS_AVAIL_INT_T \
31 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_, \
35 #define GCC_ATOMIC_INTRINSICS_AVAIL_SIZE_T \
37 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_, \
47 #if GCC_ATOMIC_INTRINSICS_AVAIL_INT_T || \
48 GCC_ATOMIC_INTRINSICS_AVAIL_SIZE_T || \
50 #define GCC_ATOMIC_INTRINSICS_AVAIL_SYNC 1
52 #define GCC_ATOMIC_INTRINSICS_AVAIL_SYNC 0
60 #if GCC_ATOMIC_INTRINSICS_AVAIL_SYNC
62 #ifndef EPICS_ATOMIC_READ_MEMORY_BARRIER
63 #define EPICS_ATOMIC_READ_MEMORY_BARRIER
66 __sync_synchronize ();
70 #ifndef EPICS_ATOMIC_WRITE_MEMORY_BARRIER
71 #define EPICS_ATOMIC_WRITE_MEMORY_BARRIER
74 __sync_synchronize ();
80 #if GCC_ATOMIC_INTRINSICS_AVAIL_INT_T
82 #define EPICS_ATOMIC_INCR_INTT
85 return __sync_add_and_fetch ( pTarget, 1 );
88 #define EPICS_ATOMIC_DECR_INTT
91 return __sync_sub_and_fetch ( pTarget, 1 );
94 #define EPICS_ATOMIC_ADD_INTT
97 return __sync_add_and_fetch ( pTarget, delta );
100 #define EPICS_ATOMIC_CAS_INTT
102 int oldVal,
int newVal )
104 return __sync_val_compare_and_swap ( pTarget, oldVal, newVal);
109 #if GCC_ATOMIC_INTRINSICS_AVAIL_SIZE_T
111 #define EPICS_ATOMIC_INCR_SIZET
114 return __sync_add_and_fetch ( pTarget, 1u );
117 #define EPICS_ATOMIC_DECR_SIZET
120 return __sync_sub_and_fetch ( pTarget, 1u );
123 #define EPICS_ATOMIC_ADD_SIZET
126 return __sync_add_and_fetch ( pTarget, delta );
129 #define EPICS_ATOMIC_SUB_SIZET
132 return __sync_sub_and_fetch ( pTarget, delta );
135 #define EPICS_ATOMIC_CAS_SIZET
137 size_t oldVal,
size_t newVal )
139 return __sync_val_compare_and_swap ( pTarget, oldVal, newVal);
142 #define EPICS_ATOMIC_CAS_PTRT
147 return __sync_val_compare_and_swap ( pTarget, oldVal, newVal);
EPICS_ATOMIC_INLINE int epicsAtomicIncrIntT(int *pTarget)
atomic increment on int value
EPICS_ATOMIC_INLINE int epicsAtomicDecrIntT(int *pTarget)
atomic decrement on int value
EPICS_ATOMIC_INLINE size_t epicsAtomicAddSizeT(size_t *pTarget, size_t delta)
atomic addition on size_t value
EPICS_ATOMIC_INLINE int epicsAtomicAddIntT(int *pTarget, int delta)
atomic addition on int value
EPICS_ATOMIC_INLINE int epicsAtomicCmpAndSwapIntT(int *pTarget, int oldVal, int newVal)
atomically compare int value with expected and if equal swap with new value
EPICS_ATOMIC_INLINE size_t epicsAtomicSubSizeT(size_t *pTarget, size_t delta)
atomic subtraction on size_t value
EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier(void)
load target into cache
EPICS_ATOMIC_INLINE size_t epicsAtomicCmpAndSwapSizeT(size_t *pTarget, size_t oldVal, size_t newVal)
atomically compare size_t value with expected and if equal swap with new value
EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier(void)
push cache version of target into target
EPICS_ATOMIC_INLINE size_t epicsAtomicIncrSizeT(size_t *pTarget)
atomic increment on size_t value
EPICS_ATOMIC_INLINE EpicsAtomicPtrT epicsAtomicCmpAndSwapPtrT(EpicsAtomicPtrT *pTarget, EpicsAtomicPtrT oldVal, EpicsAtomicPtrT newVal)
atomically compare int value with expected and if equal swap with new value
EPICS_ATOMIC_INLINE size_t epicsAtomicDecrSizeT(size_t *pTarget)
atomic decrement on size_t value