|
26 | 26 | #define OPAL_THREAD_USAGE_H |
27 | 27 |
|
28 | 28 | #include "opal/sys/atomic.h" |
| 29 | +#include "opal/prefetch.h" |
29 | 30 | #include "opal_config.h" |
30 | 31 |
|
31 | 32 | /** |
@@ -101,113 +102,85 @@ static inline bool opal_set_using_threads(bool have) |
101 | 102 | * Use an atomic operation for increment/decrement if opal_using_threads() |
102 | 103 | * indicates that threads are in use by the application or library. |
103 | 104 | */ |
| 105 | +#define OPAL_THREAD_DEFINE_ATOMIC_ADD(type, suffix) \ |
| 106 | +static inline type opal_thread_add_ ## suffix (volatile type *addr, type delta) \ |
| 107 | +{ \ |
| 108 | + if (OPAL_UNLIKELY(opal_using_threads())) { \ |
| 109 | + return opal_atomic_add_ ## suffix (addr, delta); \ |
| 110 | + } \ |
| 111 | + \ |
| 112 | + return (*addr += delta); \ |
| 113 | +} |
104 | 114 |
|
105 | | -#if OMPI_ENABLE_THREAD_MULTIPLE |
106 | | -static inline int32_t |
107 | | -OPAL_THREAD_ADD32(volatile int32_t *addr, int delta) |
108 | | -{ |
109 | | - int32_t ret; |
110 | | - |
111 | | - if (opal_using_threads()) { |
112 | | - ret = opal_atomic_add_32(addr, delta); |
113 | | - } else { |
114 | | - ret = (*addr += delta); |
115 | | - } |
116 | | - |
117 | | - return ret; |
| 115 | +#define OPAL_THREAD_DEFINE_ATOMIC_CMPSET(type, addr_type, suffix) \ |
| 116 | +static inline bool opal_thread_cmpset_bool_ ## suffix (volatile addr_type *addr, type compare, type value) \ |
| 117 | +{ \ |
| 118 | + if (OPAL_UNLIKELY(opal_using_threads())) { \ |
| 119 | + return opal_atomic_cmpset_ ## suffix ((volatile type *) addr, compare, value); \ |
| 120 | + } \ |
| 121 | + \ |
| 122 | + if ((type) *addr == compare) { \ |
| 123 | + ((type *) addr)[0] = value; \ |
| 124 | + return true; \ |
| 125 | + } \ |
| 126 | + \ |
| 127 | + return false; \ |
118 | 128 | } |
119 | | -#else |
120 | | -static inline int32_t |
121 | | -OPAL_THREAD_ADD32(volatile int32_t *addr, int delta) |
122 | | -{ |
123 | | - int32_t ret; |
124 | | - ret = (*addr += delta); |
125 | | - return ret; |
| 129 | + |
| 130 | +#define OPAL_THREAD_DEFINE_ATOMIC_SWAP(type, addr_type, suffix) \ |
| 131 | +static inline type opal_thread_swap_ ## suffix (volatile addr_type *ptr, type newvalue) \ |
| 132 | +{ \ |
| 133 | + if (opal_using_threads ()) { \ |
| 134 | + return opal_atomic_swap_ ## suffix ((volatile type *) ptr, newvalue); \ |
| 135 | + } \ |
| 136 | + \ |
| 137 | + type old = ((type *) ptr)[0]; \ |
| 138 | + ((type *) ptr)[0] = newvalue; \ |
| 139 | + \ |
| 140 | + return old; \ |
126 | 141 | } |
127 | | -#endif |
128 | 142 |
|
129 | | -#if OPAL_HAVE_ATOMIC_MATH_64 |
130 | | -#if OMPI_ENABLE_THREAD_MULTIPLE |
131 | | -static inline int64_t |
132 | | -OPAL_THREAD_ADD64(volatile int64_t *addr, int delta) |
133 | | -{ |
134 | | - int64_t ret; |
| 143 | +OPAL_THREAD_DEFINE_ATOMIC_ADD(int32_t, 32) |
| 144 | +OPAL_THREAD_DEFINE_ATOMIC_ADD(size_t, size_t) |
| 145 | +OPAL_THREAD_DEFINE_ATOMIC_CMPSET(int32_t, int32_t, 32) |
| 146 | +OPAL_THREAD_DEFINE_ATOMIC_CMPSET(void *, intptr_t, ptr) |
| 147 | +OPAL_THREAD_DEFINE_ATOMIC_SWAP(int32_t, int32_t, 32) |
| 148 | +OPAL_THREAD_DEFINE_ATOMIC_SWAP(void *, intptr_t, ptr) |
135 | 149 |
|
136 | | - if (opal_using_threads()) { |
137 | | - ret = opal_atomic_add_64(addr, delta); |
138 | | - } else { |
139 | | - ret = (*addr += delta); |
140 | | - } |
| 150 | +#define OPAL_THREAD_ADD32 opal_thread_add_32 |
| 151 | +#define OPAL_ATOMIC_ADD32 opal_thread_add_32 |
141 | 152 |
|
142 | | - return ret; |
143 | | -} |
144 | | -#else |
145 | | -static inline int64_t |
146 | | -OPAL_THREAD_ADD64(volatile int64_t *addr, int delta) |
147 | | -{ |
148 | | - int64_t ret; |
149 | | - ret = (*addr += delta); |
150 | | - return ret; |
151 | | -} |
152 | | -#endif |
153 | | -#endif |
| 153 | +#define OPAL_THREAD_ADD_SIZE_T opal_thread_add_size_t |
| 154 | +#define OPAL_ATOMIC_ADD_SIZE_T opal_thread_add_size_t |
154 | 155 |
|
155 | | -#if OMPI_ENABLE_THREAD_MULTIPLE |
156 | | -static inline size_t |
157 | | -OPAL_THREAD_ADD_SIZE_T(volatile size_t *addr, int delta) |
158 | | -{ |
159 | | - size_t ret; |
| 156 | +#define OPAL_THREAD_CMPSET_32 opal_thread_cmpset_bool_32 |
| 157 | +#define OPAL_ATOMIC_CMPSET_32 opal_thread_cmpset_bool_32 |
160 | 158 |
|
161 | | - if (opal_using_threads()) { |
162 | | - ret = opal_atomic_add_size_t(addr, delta); |
163 | | - } else { |
164 | | - ret = (*addr += delta); |
165 | | - } |
| 159 | +#define OPAL_THREAD_CMPSET_PTR(x, y, z) opal_thread_cmpset_bool_ptr ((volatile intptr_t *) x, (void *) y, (void *) z) |
| 160 | +#define OPAL_ATOMIC_CMPSET_PTR OPAL_THREAD_CMPSET_PTR |
166 | 161 |
|
167 | | - return ret; |
168 | | -} |
169 | | -#else |
170 | | -static inline size_t |
171 | | -OPAL_THREAD_ADD_SIZE_T(volatile size_t *addr, int delta) |
172 | | -{ |
173 | | - size_t ret; |
174 | | - ret = (*addr += delta); |
175 | | - return ret; |
176 | | -} |
177 | | -#endif |
| 162 | +#define OPAL_THREAD_SWAP_32 opal_thread_swap_32 |
| 163 | +#define OPAL_ATOMIC_SWAP_32 opal_thread_swap_32 |
178 | 164 |
|
179 | | -/* BWB: FIX ME: remove if possible */ |
180 | | -#define OPAL_CMPSET(x, y, z) ((*(x) == (y)) ? ((*(x) = (z)), 1) : 0) |
| 165 | +#define OPAL_THREAD_SWAP_PTR(x, y) opal_thread_swap_ptr ((volatile intptr_t *) x, (void *) y) |
| 166 | +#define OPAL_ATOMIC_SWAP_PTR OPAL_THREAD_SWAP_PTR |
181 | 167 |
|
182 | | -#if OPAL_HAVE_ATOMIC_CMPSET_32 |
183 | | -#define OPAL_ATOMIC_CMPSET_32(x, y, z) \ |
184 | | - (opal_using_threads() ? opal_atomic_cmpset_32(x, y, z) : OPAL_CMPSET(x, y, z)) |
185 | | -#endif |
186 | | -#if OPAL_HAVE_ATOMIC_CMPSET_64 |
187 | | -#define OPAL_ATOMIC_CMPSET_64(x, y, z) \ |
188 | | - (opal_using_threads() ? opal_atomic_cmpset_64(x, y, z) : OPAL_CMPSET(x, y, z)) |
189 | | -#endif |
190 | | -#if OPAL_HAVE_ATOMIC_CMPSET_32 || OPAL_HAVE_ATOMIC_CMPSET_64 |
191 | | -#define OPAL_ATOMIC_CMPSET(x, y, z) \ |
192 | | - (opal_using_threads() ? opal_atomic_cmpset(x, y, z) : OPAL_CMPSET(x, y, z)) |
193 | | -#endif |
194 | | -#if OPAL_HAVE_ATOMIC_CMPSET_32 || OPAL_HAVE_ATOMIC_CMPSET_64 |
195 | | -#define OPAL_ATOMIC_CMPSET_PTR(x, y, z) \ |
196 | | - (opal_using_threads() ? opal_atomic_cmpset_ptr(x, y, z) : OPAL_CMPSET(x, y, z)) |
197 | | -#endif |
| 168 | +/* define 64-bit macros is 64-bit atomic math is available */ |
| 169 | +#if OPAL_HAVE_ATOMIC_MATH_64 |
198 | 170 |
|
199 | | -static inline void *opal_thread_swap_ptr (volatile void *ptr, void *newvalue) |
200 | | -{ |
201 | | - if (opal_using_threads ()) { |
202 | | - return opal_atomic_swap_ptr (ptr, newvalue); |
203 | | - } |
| 171 | +OPAL_THREAD_DEFINE_ATOMIC_ADD(int64_t, 64) |
| 172 | +OPAL_THREAD_DEFINE_ATOMIC_CMPSET(int64_t, int64_t, 64) |
| 173 | +OPAL_THREAD_DEFINE_ATOMIC_SWAP(int64_t, int64_t, 64) |
204 | 174 |
|
205 | | - void *old = ((void **) ptr)[0]; |
206 | | - ((void **) ptr)[0] = newvalue; |
| 175 | +#define OPAL_THREAD_ADD64 opal_thread_add_64 |
| 176 | +#define OPAL_ATOMIC_ADD64 opal_thread_add_64 |
207 | 177 |
|
208 | | - return old; |
209 | | -} |
| 178 | +#define OPAL_THREAD_CMPSET_64 opal_thread_cmpset_bool_64 |
| 179 | +#define OPAL_ATOMIC_CMPSET_64 opal_thread_cmpset_bool_64 |
210 | 180 |
|
211 | | -#define OPAL_ATOMIC_SWAP_PTR(x, y) opal_thread_swap_ptr (x, y) |
| 181 | +#define OPAL_THREAD_SWAP_64 opal_thread_swap_64 |
| 182 | +#define OPAL_ATOMIC_SWAP_64 opal_thread_swap_64 |
| 183 | + |
| 184 | +#endif |
212 | 185 |
|
213 | 186 | #endif /* !defined(OPAL_THREAD_USAGE_H) */ |
0 commit comments