17 #ifndef epicsAtomicCD_h 18 #define epicsAtomicCD_h 21 # error this header is only for use with the gnu compiler 24 #define EPICS_ATOMIC_CMPLR_NAME "GCC" 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_, \ 34 #define GCC_ATOMIC_INTRINSICS_AVAIL_SIZE_T \ 36 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_, \ 39 #define GCC_ATOMIC_INTRINSICS_MIN_X86 \ 40 ( defined ( __i486 ) || defined ( __pentium ) || \ 41 defined ( __pentiumpro ) || defined ( __MMX__ ) ) 43 #define GCC_ATOMIC_INTRINSICS_GCC4_OR_BETTER \ 44 ( ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 401 ) 46 #define GCC_ATOMIC_INTRINSICS_AVAIL_EARLIER \ 47 ( GCC_ATOMIC_INTRINSICS_MIN_X86 && \ 48 GCC_ATOMIC_INTRINSICS_GCC4_OR_BETTER ) 69 #if GCC_ATOMIC_INTRINSICS_GCC4_OR_BETTER 71 #ifndef EPICS_ATOMIC_READ_MEMORY_BARRIER 72 #define EPICS_ATOMIC_READ_MEMORY_BARRIER 73 EPICS_ATOMIC_INLINE
void epicsAtomicReadMemoryBarrier (
void)
75 __sync_synchronize ();
79 #ifndef EPICS_ATOMIC_WRITE_MEMORY_BARRIER 80 #define EPICS_ATOMIC_WRITE_MEMORY_BARRIER 81 EPICS_ATOMIC_INLINE
void epicsAtomicWriteMemoryBarrier (
void)
83 __sync_synchronize ();
89 #ifndef EPICS_ATOMIC_READ_MEMORY_BARRIER 90 #if GCC_ATOMIC_INTRINSICS_MIN_X86 91 #define EPICS_ATOMIC_READ_MEMORY_BARRIER 92 EPICS_ATOMIC_INLINE
void epicsAtomicReadMemoryBarrier (
void)
99 #ifndef EPICS_ATOMIC_WRITE_MEMORY_BARRIER 100 #if GCC_ATOMIC_INTRINSICS_MIN_X86 101 #define EPICS_ATOMIC_WRITE_MEMORY_BARRIER 102 EPICS_ATOMIC_INLINE
void epicsAtomicWriteMemoryBarrier (
void)
111 #if GCC_ATOMIC_INTRINSICS_AVAIL_INT_T \ 112 || GCC_ATOMIC_INTRINSICS_AVAIL_EARLIER 114 #define EPICS_ATOMIC_INCR_INTT 115 EPICS_ATOMIC_INLINE
int epicsAtomicIncrIntT (
int * pTarget )
117 return __sync_add_and_fetch ( pTarget, 1 );
120 #define EPICS_ATOMIC_DECR_INTT 121 EPICS_ATOMIC_INLINE
int epicsAtomicDecrIntT (
int * pTarget )
123 return __sync_sub_and_fetch ( pTarget, 1 );
126 #define EPICS_ATOMIC_ADD_INTT 127 EPICS_ATOMIC_INLINE
int epicsAtomicAddIntT (
int * pTarget,
int delta )
129 return __sync_add_and_fetch ( pTarget, delta );
132 #define EPICS_ATOMIC_CAS_INTT 133 EPICS_ATOMIC_INLINE
int epicsAtomicCmpAndSwapIntT (
int * pTarget,
134 int oldVal,
int newVal )
136 return __sync_val_compare_and_swap ( pTarget, oldVal, newVal);
141 #if GCC_ATOMIC_INTRINSICS_AVAIL_SIZE_T \ 142 || GCC_ATOMIC_INTRINSICS_AVAIL_EARLIER 144 #define EPICS_ATOMIC_INCR_SIZET 145 EPICS_ATOMIC_INLINE
size_t epicsAtomicIncrSizeT (
size_t * pTarget )
147 return __sync_add_and_fetch ( pTarget, 1u );
150 #define EPICS_ATOMIC_DECR_SIZET 151 EPICS_ATOMIC_INLINE
size_t epicsAtomicDecrSizeT (
size_t * pTarget )
153 return __sync_sub_and_fetch ( pTarget, 1u );
156 #define EPICS_ATOMIC_ADD_SIZET 157 EPICS_ATOMIC_INLINE
size_t epicsAtomicAddSizeT (
size_t * pTarget,
size_t delta )
159 return __sync_add_and_fetch ( pTarget, delta );
162 #define EPICS_ATOMIC_SUB_SIZET 163 EPICS_ATOMIC_INLINE
size_t epicsAtomicSubSizeT (
size_t * pTarget,
size_t delta )
165 return __sync_sub_and_fetch ( pTarget, delta );
168 #define EPICS_ATOMIC_CAS_SIZET 169 EPICS_ATOMIC_INLINE
size_t epicsAtomicCmpAndSwapSizeT (
size_t * pTarget,
170 size_t oldVal,
size_t newVal )
172 return __sync_val_compare_and_swap ( pTarget, oldVal, newVal);
175 #define EPICS_ATOMIC_CAS_PTRT 176 EPICS_ATOMIC_INLINE EpicsAtomicPtrT epicsAtomicCmpAndSwapPtrT (
177 EpicsAtomicPtrT * pTarget,
178 EpicsAtomicPtrT oldVal, EpicsAtomicPtrT newVal )
180 return __sync_val_compare_and_swap ( pTarget, oldVal, newVal);
193 #include "epicsAtomicOSD.h"