19 #ifndef OMPI_SYS_ARCH_ATOMIC_H
20 #define OMPI_SYS_ARCH_ATOMIC_H 1
23 #if defined(HAVE_WDM_H)
32 #define OPAL_HAVE_ATOMIC_MEM_BARRIER 1
36 #if defined(HAVE_WDM_H)
37 return KeMemoryBarrier();
43 #if defined(HAVE_WDM_H)
44 return KeMemoryBarrier();
50 #if defined(HAVE_WDM_H)
51 return KeMemoryBarrier();
61 #define OPAL_HAVE_ATOMIC_CMPSET_32 1
62 static inline int opal_atomic_cmpset_acq_32(
volatile int32_t *addr,
63 int32_t oldval, int32_t newval)
65 #if HAVE_INTERLOCKEDCOMPAREEXCHANGEACQUIRE
66 int32_t ret = InterlockedCompareExchangeAcquire( (
long volatile*)addr,
67 (
long)newval, (
long)oldval);
69 int32_t ret = InterlockedCompareExchange( (
long volatile*)addr,
70 (
long)newval, (
long)oldval );
72 return (oldval == ret) ? 1: 0;
76 static inline int opal_atomic_cmpset_rel_32(
volatile int32_t *addr,
77 int32_t oldval, int32_t newval)
79 #if HAVE_INTERLOCKEDCOMPAREEXCHANGERELEASE
80 int32_t ret = InterlockedCompareExchangeRelease( (
long volatile*)addr,
81 (
long)newval, (
long)oldval );
83 int32_t ret = InterlockedCompareExchange( (
long volatile*)addr,
84 (
long)newval, (
long)oldval );
86 return (oldval == ret) ? 1: 0;
89 static inline int opal_atomic_cmpset_32(
volatile int32_t *addr,
90 int32_t oldval, int32_t newval)
92 int32_t ret = InterlockedCompareExchange ((
long volatile*) addr,
93 (
long) newval, (
long) oldval);
95 return (oldval == ret) ? 1: 0;
98 #define OPAL_HAVE_ATOMIC_MATH_32 1
100 #define OPAL_HAVE_ATOMIC_ADD_32 1
101 static inline int32_t opal_atomic_add_32(
volatile int32_t *addr, int32_t delta)
103 return InterlockedExchangeAdd ((LONG
volatile *) addr,
107 #define OPAL_HAVE_ATOMIC_SUB_32 1
108 static inline int32_t opal_atomic_sub_32(
volatile int32_t *addr, int32_t delta)
110 return InterlockedExchangeAdd( (LONG
volatile *) addr,
114 #if HAVE_INTERLOCKEDCOMPAREEXCHANGE64
115 #define OPAL_HAVE_ATOMIC_CMPSET_64 1
116 static inline int opal_atomic_cmpset_acq_64(
volatile int64_t *addr,
117 int64_t oldval, int64_t newval)
122 #if HAVE_INTERLOCKEDCOMPAREEXCHANGEACQUIRE64
123 int64_t ret = InterlockedCompareExchangeAcquire64 ((int64_t
volatile*) addr,
124 (int64_t) newval, (int64_t) oldval);
126 int64_t ret = InterlockedCompareExchange64 ((int64_t
volatile*) addr,
127 (int64_t) newval, (int64_t) oldval);
129 return (oldval == ret) ? 1: 0;
132 static inline int opal_atomic_cmpset_rel_64(
volatile int64_t *addr,
133 int64_t oldval, int64_t newval)
135 #if HAVE_INTERLOCKEDCOMPAREEXCHANGERELEASE64
136 int64_t ret = InterlockedCompareExchangeRelease64 ((int64_t
volatile*) addr,
137 (int64_t) newval, (int64_t) oldval);
139 int64_t ret = InterlockedCompareExchange64 ((int64_t
volatile*) addr,
140 (int64_t) newval, (int64_t) oldval);
142 return (oldval == ret) ? 1: 0;
146 static inline int opal_atomic_cmpset_64(
volatile int64_t *addr,
147 int64_t oldval, int64_t newval)
149 int64_t ret = InterlockedCompareExchange64 ((int64_t
volatile*) addr,
150 (int64_t) newval, (int64_t) oldval);
151 return (oldval == ret) ? 1: 0;
154 #define OPAL_HAVE_ATOMIC_MATH_64 1
155 #define OPAL_HAVE_ATOMIC_ADD_64 1
156 static inline int64_t opal_atomic_add_64(
volatile int64_t *addr, int64_t delta)
158 return InterlockedExchangeAdd64 ((int64_t
volatile *) addr,
162 #define OPAL_HAVE_ATOMIC_SUB_64 1
163 static inline int64_t opal_atomic_sub_64(
volatile int64_t *addr, int64_t delta)
165 return InterlockedExchangeAdd64 ((int64_t
volatile *) addr,
171 #define OPAL_HAVE_ATOMIC_CMPSET_64 0
172 #define OPAL_HAVE_ATOMIC_MATH_64 0
173 #define OPAL_HAVE_ATOMIC_ADD_64 0
174 #define OPAL_HAVE_ATOMIC_SUB_64 0
void opal_atomic_rmb(void)
Read memory barrier.
void opal_atomic_mb(void)
Memory barrier.
void opal_atomic_wmb(void)
Write memory barrier.