15 #ifndef epicsAtomicOSD_h 16 #define epicsAtomicOSD_h 19 #ifndef _VSB_CONFIG_FILE 20 # define _VSB_CONFIG_FILE <../lib/h/config/vsbConfig.h> 30 #if _WRS_VXWORKS_MAJOR * 100 + _WRS_VXWORKS_MINOR >= 606 33 #include <vxAtomicLib.h> 35 #define EPICS_ATOMIC_OS_NAME "VX-ATOMICLIB" 41 #ifndef EPICS_ATOMIC_READ_MEMORY_BARRIER 42 #define EPICS_ATOMIC_READ_MEMORY_BARRIER 49 #ifndef EPICS_ATOMIC_WRITE_MEMORY_BARRIER 50 #define EPICS_ATOMIC_WRITE_MEMORY_BARRIER 67 #if ULONG_MAX == UINT_MAX 73 #ifndef EPICS_ATOMIC_INCR_SIZET 74 #define EPICS_ATOMIC_INCR_SIZET 77 atomic_t *
const pTarg = ( atomic_t * ) ( pTarget );
78 const atomic_t oldVal = vxAtomicInc ( pTarg );
79 return 1 + ( size_t ) ( oldVal );
83 #ifndef EPICS_ATOMIC_DECR_SIZET 84 #define EPICS_ATOMIC_DECR_SIZET 87 atomic_t *
const pTarg = ( atomic_t * ) ( pTarget );
88 const atomic_t oldVal = vxAtomicDec ( pTarg );
89 return ( (
size_t ) oldVal ) - 1u;
93 #ifndef EPICS_ATOMIC_ADD_SIZET 94 #define EPICS_ATOMIC_ADD_SIZET 103 atomic_t *
const pTarg = ( atomic_t * ) ( pTarget );
104 const atomic_t oldVal = vxAtomicAdd ( pTarg, (atomic_t) delta );
105 return delta + ( size_t ) oldVal;
109 #ifndef EPICS_ATOMIC_SUB_SIZET 110 #define EPICS_ATOMIC_SUB_SIZET 119 atomic_t *
const pTarg = ( atomic_t * ) ( pTarget );
120 const atomic_t oldVal = vxAtomicSub ( pTarg, (atomic_t) delta );
121 return ( (
size_t ) oldVal ) - delta;
125 #ifndef EPICS_ATOMIC_CAS_SIZET 126 #define EPICS_ATOMIC_CAS_SIZET 128 size_t oldVal,
size_t newVal )
130 atomic_t *
const pTarg = ( atomic_t * ) ( pTarget );
131 return (
size_t ) vxCas ( pTarg, (atomic_t) oldVal, (atomic_t) newVal );
135 #ifndef EPICS_ATOMIC_CAS_PTRT 136 #define EPICS_ATOMIC_CAS_PTRT 140 atomic_t *
const pTarg = ( atomic_t * ) ( pTarget );
141 return (
EpicsAtomicPtrT) vxCas ( pTarg, (atomic_t) oldVal, (atomic_t) newVal );
162 #ifndef EPICS_ATOMIC_INCR_INTT 163 #define EPICS_ATOMIC_INCR_INTT 166 atomic_t *
const pTarg = ( atomic_t * ) ( pTarget );
167 const atomic_t oldVal = vxAtomicInc ( pTarg );
168 return 1 + ( int ) oldVal;
172 #ifndef EPICS_ATOMIC_DECR_INTT 173 #define EPICS_ATOMIC_DECR_INTT 176 atomic_t *
const pTarg = ( atomic_t * ) ( pTarget );
177 const atomic_t oldVal = vxAtomicDec ( pTarg );
178 return ( (
int ) oldVal ) - 1;
182 #ifndef EPICS_ATOMIC_ADD_INTT 183 #define EPICS_ATOMIC_ADD_INTT 186 atomic_t *
const pTarg = ( atomic_t * ) ( pTarget );
187 const atomic_t oldVal = vxAtomicAdd ( pTarg, (atomic_t) delta );
188 return delta + ( int ) oldVal;
192 #ifndef EPICS_ATOMIC_CAS_INTT 193 #define EPICS_ATOMIC_CAS_INTT 195 int oldVal,
int newVal )
197 atomic_t *
const pTarg = ( atomic_t * ) ( pTarget );
198 return (
int ) vxCas ( pTarg, (atomic_t) oldVal, (atomic_t) newVal );
211 #define EPICS_ATOMIC_OS_NAME "VX-INTLIB" 217 #ifndef EPICS_ATOMIC_LOCK 218 #define EPICS_ATOMIC_LOCK 224 pKey->
m_key = intLock ();
229 intUnlock ( pKey->
m_key );
233 #ifndef EPICS_ATOMIC_READ_MEMORY_BARRIER 234 #define EPICS_ATOMIC_READ_MEMORY_BARRIER 242 #ifndef EPICS_ATOMIC_WRITE_MEMORY_BARRIER 243 #define EPICS_ATOMIC_WRITE_MEMORY_BARRIER EPICS_ATOMIC_INLINE size_t epicsAtomicCmpAndSwapSizeT(size_t *pTarget, size_t oldVal, size_t newVal)
An EPICS-specific replacement for ANSI C's assert.
EPICS_ATOMIC_INLINE size_t epicsAtomicSubSizeT(size_t *pTarget, size_t delta)
struct EpicsAtomicLockKey EpicsAtomicLockKey
EPICS_ATOMIC_INLINE int epicsAtomicCmpAndSwapIntT(int *pTarget, int oldVal, int newVal)
#define VX_MEM_BARRIER_R()
EPICS_ATOMIC_INLINE size_t epicsAtomicAddSizeT(size_t *pTarget, size_t delta)
EPICS_ATOMIC_INLINE size_t epicsAtomicDecrSizeT(size_t *pTarget)
LIBCOM_API void epicsAtomicLock(struct EpicsAtomicLockKey *)
#define EPICS_ATOMIC_INLINE
#define STATIC_ASSERT(expr)
Declare a condition that should be true at compile-time.
EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier(void)
EPICS_ATOMIC_INLINE EpicsAtomicPtrT epicsAtomicCmpAndSwapPtrT(EpicsAtomicPtrT *pTarget, EpicsAtomicPtrT oldVal, EpicsAtomicPtrT newVal)
EPICS_ATOMIC_INLINE int epicsAtomicAddIntT(int *pTarget, int delta)
LIBCOM_API void epicsAtomicUnlock(struct EpicsAtomicLockKey *)
EPICS_ATOMIC_INLINE int epicsAtomicDecrIntT(int *pTarget)
EPICS_ATOMIC_INLINE int epicsAtomicIncrIntT(int *pTarget)
EPICS_ATOMIC_INLINE size_t epicsAtomicIncrSizeT(size_t *pTarget)
#define VX_MEM_BARRIER_W()
EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier(void)