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
64 EPICS_ATOMIC_INLINE
void epicsAtomicReadMemoryBarrier (
void)
66 __sync_synchronize ();
70 #ifndef EPICS_ATOMIC_WRITE_MEMORY_BARRIER
71 #define EPICS_ATOMIC_WRITE_MEMORY_BARRIER
72 EPICS_ATOMIC_INLINE
void epicsAtomicWriteMemoryBarrier (
void)
74 __sync_synchronize ();
80 #if GCC_ATOMIC_INTRINSICS_AVAIL_INT_T
82 #define EPICS_ATOMIC_INCR_INTT
83 EPICS_ATOMIC_INLINE
int epicsAtomicIncrIntT (
int * pTarget )
85 return __sync_add_and_fetch ( pTarget, 1 );
88 #define EPICS_ATOMIC_DECR_INTT
89 EPICS_ATOMIC_INLINE
int epicsAtomicDecrIntT (
int * pTarget )
91 return __sync_sub_and_fetch ( pTarget, 1 );
94 #define EPICS_ATOMIC_ADD_INTT
95 EPICS_ATOMIC_INLINE
int epicsAtomicAddIntT (
int * pTarget,
int delta )
97 return __sync_add_and_fetch ( pTarget, delta );
100 #define EPICS_ATOMIC_CAS_INTT
101 EPICS_ATOMIC_INLINE
int epicsAtomicCmpAndSwapIntT (
int * pTarget,
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
112 EPICS_ATOMIC_INLINE
size_t epicsAtomicIncrSizeT (
size_t * pTarget )
114 return __sync_add_and_fetch ( pTarget, 1u );
117 #define EPICS_ATOMIC_DECR_SIZET
118 EPICS_ATOMIC_INLINE
size_t epicsAtomicDecrSizeT (
size_t * pTarget )
120 return __sync_sub_and_fetch ( pTarget, 1u );
123 #define EPICS_ATOMIC_ADD_SIZET
124 EPICS_ATOMIC_INLINE
size_t epicsAtomicAddSizeT (
size_t * pTarget,
size_t delta )
126 return __sync_add_and_fetch ( pTarget, delta );
129 #define EPICS_ATOMIC_SUB_SIZET
130 EPICS_ATOMIC_INLINE
size_t epicsAtomicSubSizeT (
size_t * pTarget,
size_t delta )
132 return __sync_sub_and_fetch ( pTarget, delta );
135 #define EPICS_ATOMIC_CAS_SIZET
136 EPICS_ATOMIC_INLINE
size_t epicsAtomicCmpAndSwapSizeT (
size_t * pTarget,
137 size_t oldVal,
size_t newVal )
139 return __sync_val_compare_and_swap ( pTarget, oldVal, newVal);
142 #define EPICS_ATOMIC_CAS_PTRT
143 EPICS_ATOMIC_INLINE EpicsAtomicPtrT epicsAtomicCmpAndSwapPtrT (
144 EpicsAtomicPtrT * pTarget,
145 EpicsAtomicPtrT oldVal, EpicsAtomicPtrT newVal )
147 return __sync_val_compare_and_swap ( pTarget, oldVal, newVal);