This source file includes following definitions.
- opal_atomic_add_fetch_size_t
- opal_atomic_fetch_add_size_t
- opal_atomic_sub_fetch_size_t
- opal_atomic_fetch_sub_size_t
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 #ifndef OPAL_SYS_ATOMIC_H
52 #define OPAL_SYS_ATOMIC_H 1
53
54 #include "opal_config.h"
55
56 #include <stdbool.h>
57
58 #include "opal/sys/architecture.h"
59 #include "opal_stdatomic.h"
60
61 #if OPAL_ASSEMBLY_BUILTIN == OPAL_BUILTIN_C11
62
63 #include "atomic_stdc.h"
64
65 #else
66
67
68
69 #ifdef OPAL_DISABLE_INLINE_ASM
70 #undef OPAL_C_GCC_INLINE_ASSEMBLY
71 #define OPAL_C_GCC_INLINE_ASSEMBLY 0
72 #endif
73
74
75
76
77 #if defined(c_plusplus) || defined(__cplusplus)
78
79 #define OPAL_GCC_INLINE_ASSEMBLY 0
80 #else
81 #define OPAL_GCC_INLINE_ASSEMBLY OPAL_C_GCC_INLINE_ASSEMBLY
82 #endif
83
84
85 BEGIN_C_DECLS
86
87
88
89
90
91
92
93
94
95
96
97
98
99 struct opal_atomic_lock_t {
100 union {
101 opal_atomic_int32_t lock;
102 volatile unsigned char sparc_lock;
103 char padding[sizeof(int)];
104 } u;
105 };
106 typedef struct opal_atomic_lock_t opal_atomic_lock_t;
107
108
109
110
111
112
113
114 #if !OPAL_GCC_INLINE_ASSEMBLY
115 #define OPAL_HAVE_INLINE_ATOMIC_MEM_BARRIER 0
116 #define OPAL_HAVE_INLINE_ATOMIC_COMPARE_EXCHANGE_32 0
117 #define OPAL_HAVE_INLINE_ATOMIC_COMPARE_EXCHANGE_64 0
118 #define OPAL_HAVE_INLINE_ATOMIC_ADD_32 0
119 #define OPAL_HAVE_INLINE_ATOMIC_AND_32 0
120 #define OPAL_HAVE_INLINE_ATOMIC_OR_32 0
121 #define OPAL_HAVE_INLINE_ATOMIC_XOR_32 0
122 #define OPAL_HAVE_INLINE_ATOMIC_SUB_32 0
123 #define OPAL_HAVE_INLINE_ATOMIC_ADD_64 0
124 #define OPAL_HAVE_INLINE_ATOMIC_AND_64 0
125 #define OPAL_HAVE_INLINE_ATOMIC_OR_64 0
126 #define OPAL_HAVE_INLINE_ATOMIC_XOR_64 0
127 #define OPAL_HAVE_INLINE_ATOMIC_SUB_64 0
128 #define OPAL_HAVE_INLINE_ATOMIC_SWAP_32 0
129 #define OPAL_HAVE_INLINE_ATOMIC_SWAP_64 0
130 #else
131 #define OPAL_HAVE_INLINE_ATOMIC_MEM_BARRIER 1
132 #define OPAL_HAVE_INLINE_ATOMIC_COMPARE_EXCHANGE_32 1
133 #define OPAL_HAVE_INLINE_ATOMIC_COMPARE_EXCHANGE_64 1
134 #define OPAL_HAVE_INLINE_ATOMIC_ADD_32 1
135 #define OPAL_HAVE_INLINE_ATOMIC_AND_32 1
136 #define OPAL_HAVE_INLINE_ATOMIC_OR_32 1
137 #define OPAL_HAVE_INLINE_ATOMIC_XOR_32 1
138 #define OPAL_HAVE_INLINE_ATOMIC_SUB_32 1
139 #define OPAL_HAVE_INLINE_ATOMIC_ADD_64 1
140 #define OPAL_HAVE_INLINE_ATOMIC_AND_64 1
141 #define OPAL_HAVE_INLINE_ATOMIC_OR_64 1
142 #define OPAL_HAVE_INLINE_ATOMIC_XOR_64 1
143 #define OPAL_HAVE_INLINE_ATOMIC_SUB_64 1
144 #define OPAL_HAVE_INLINE_ATOMIC_SWAP_32 1
145 #define OPAL_HAVE_INLINE_ATOMIC_SWAP_64 1
146 #endif
147
148
149
150
151 enum {
152 OPAL_ATOMIC_LOCK_UNLOCKED = 0,
153 OPAL_ATOMIC_LOCK_LOCKED = 1
154 };
155
156 #define OPAL_ATOMIC_LOCK_INIT {.u = {.lock = OPAL_ATOMIC_LOCK_UNLOCKED}}
157
158
159
160
161
162
163
164 #if defined(DOXYGEN)
165
166 #elif OPAL_ASSEMBLY_BUILTIN == OPAL_BUILTIN_SYNC
167 #include "opal/sys/sync_builtin/atomic.h"
168 #elif OPAL_ASSEMBLY_BUILTIN == OPAL_BUILTIN_GCC
169 #include "opal/sys/gcc_builtin/atomic.h"
170 #elif OPAL_ASSEMBLY_ARCH == OPAL_X86_64
171 #include "opal/sys/x86_64/atomic.h"
172 #elif OPAL_ASSEMBLY_ARCH == OPAL_ARM
173 #include "opal/sys/arm/atomic.h"
174 #elif OPAL_ASSEMBLY_ARCH == OPAL_ARM64
175 #include "opal/sys/arm64/atomic.h"
176 #elif OPAL_ASSEMBLY_ARCH == OPAL_IA32
177 #include "opal/sys/ia32/atomic.h"
178 #elif OPAL_ASSEMBLY_ARCH == OPAL_IA64
179 #include "opal/sys/ia64/atomic.h"
180 #elif OPAL_ASSEMBLY_ARCH == OPAL_MIPS
181 #include "opal/sys/mips/atomic.h"
182 #elif OPAL_ASSEMBLY_ARCH == OPAL_POWERPC32
183 #include "opal/sys/powerpc/atomic.h"
184 #elif OPAL_ASSEMBLY_ARCH == OPAL_POWERPC64
185 #include "opal/sys/powerpc/atomic.h"
186 #elif OPAL_ASSEMBLY_ARCH == OPAL_SPARC
187 #include "opal/sys/sparc/atomic.h"
188 #elif OPAL_ASSEMBLY_ARCH == OPAL_SPARCV9_32
189 #include "opal/sys/sparcv9/atomic.h"
190 #elif OPAL_ASSEMBLY_ARCH == OPAL_SPARCV9_64
191 #include "opal/sys/sparcv9/atomic.h"
192 #endif
193
194 #ifndef DOXYGEN
195
196
197
198 #ifndef OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_32
199 #define OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_32 0
200 #endif
201 #ifndef OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_64
202 #define OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_64 0
203 #endif
204 #ifndef OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_128
205 #define OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_128 0
206 #endif
207 #ifndef OPAL_HAVE_ATOMIC_LLSC_32
208 #define OPAL_HAVE_ATOMIC_LLSC_32 0
209 #endif
210 #ifndef OPAL_HAVE_ATOMIC_LLSC_64
211 #define OPAL_HAVE_ATOMIC_LLSC_64 0
212 #endif
213 #endif
214
215
216
217
218
219
220
221 #if !defined(OPAL_HAVE_ATOMIC_MEM_BARRIER) && !defined(DOXYGEN)
222
223 #define OPAL_HAVE_ATOMIC_MEM_BARRIER 0
224 #endif
225
226 #if defined(DOXYGEN) || OPAL_HAVE_ATOMIC_MEM_BARRIER
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241 #if OPAL_HAVE_INLINE_ATOMIC_MEM_BARRIER
242 static inline
243 #endif
244 void opal_atomic_mb(void);
245
246
247
248
249
250
251
252
253
254
255
256 #if OPAL_HAVE_INLINE_ATOMIC_MEM_BARRIER
257 static inline
258 #endif
259 void opal_atomic_rmb(void);
260
261
262
263
264
265
266
267
268
269
270
271 #if OPAL_HAVE_INLINE_ATOMIC_MEM_BARRIER
272 static inline
273 #endif
274 void opal_atomic_wmb(void);
275
276 #endif
277
278
279
280
281
282
283
284
285 #if !defined(OPAL_HAVE_ATOMIC_SPINLOCKS) && !defined(DOXYGEN)
286
287
288 #define OPAL_HAVE_ATOMIC_SPINLOCKS 0
289 #endif
290
291 #if defined(DOXYGEN) || OPAL_HAVE_ATOMIC_SPINLOCKS || (OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_32 || OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_64)
292
293
294
295
296
297
298
299 #if OPAL_HAVE_ATOMIC_SPINLOCKS == 0
300 static inline
301 #endif
302 void opal_atomic_lock_init(opal_atomic_lock_t* lock, int32_t value);
303
304
305
306
307
308
309
310
311 #if OPAL_HAVE_ATOMIC_SPINLOCKS == 0
312 static inline
313 #endif
314 int opal_atomic_trylock(opal_atomic_lock_t *lock);
315
316
317
318
319
320
321
322 #if OPAL_HAVE_ATOMIC_SPINLOCKS == 0
323 static inline
324 #endif
325 void opal_atomic_lock(opal_atomic_lock_t *lock);
326
327
328
329
330
331
332
333 #if OPAL_HAVE_ATOMIC_SPINLOCKS == 0
334 static inline
335 #endif
336 void opal_atomic_unlock(opal_atomic_lock_t *lock);
337
338
339 #if OPAL_HAVE_ATOMIC_SPINLOCKS == 0
340 #undef OPAL_HAVE_ATOMIC_SPINLOCKS
341 #define OPAL_HAVE_ATOMIC_SPINLOCKS (OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_32 || OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_64)
342 #define OPAL_NEED_INLINE_ATOMIC_SPINLOCKS 1
343 #endif
344
345 #endif
346
347
348
349
350
351
352
353 #if !defined(OPAL_HAVE_ATOMIC_CMPSET_32) && !defined(DOXYGEN)
354 #define OPAL_HAVE_ATOMIC_CMPSET_32 0
355 #endif
356 #if defined(DOXYGEN) || OPAL_HAVE_ATOMIC_CMPSET_32
357
358 #if OPAL_HAVE_INLINE_ATOMIC_COMPARE_EXCHANGE_32
359 static inline
360 #endif
361 bool opal_atomic_compare_exchange_strong_32 (opal_atomic_int32_t *addr, int32_t *oldval,
362 int32_t newval);
363
364 #if OPAL_HAVE_INLINE_ATOMIC_COMPARE_EXCHANGE_32
365 static inline
366 #endif
367 bool opal_atomic_compare_exchange_strong_acq_32 (opal_atomic_int32_t *addr, int32_t *oldval,
368 int32_t newval);
369
370 #if OPAL_HAVE_INLINE_ATOMIC_COMPARE_EXCHANGE_32
371 static inline
372 #endif
373 bool opal_atomic_compare_exchange_strong_rel_32 (opal_atomic_int32_t *addr, int32_t *oldval,
374 int32_t newval);
375 #endif
376
377
378 #if !defined(OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_64) && !defined(DOXYGEN)
379 #define OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_64 0
380 #endif
381 #if defined(DOXYGEN) || OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_64
382
383 #if OPAL_HAVE_INLINE_ATOMIC_COMPARE_EXCHANGE_64
384 static inline
385 #endif
386 bool opal_atomic_compare_exchange_strong_64 (opal_atomic_int64_t *addr, int64_t *oldval,
387 int64_t newval);
388
389 #if OPAL_HAVE_INLINE_ATOMIC_COMPARE_EXCHANGE_64
390 static inline
391 #endif
392 bool opal_atomic_compare_exchange_strong_acq_64 (opal_atomic_int64_t *addr, int64_t *oldval,
393 int64_t newval);
394
395 #if OPAL_HAVE_INLINE_ATOMIC_COMPARE_EXCHANGE_64
396 static inline
397 #endif
398 bool opal_atomic_compare_exchange_strong_rel_64 (opal_atomic_int64_t *addr, int64_t *oldval,
399 int64_t newval);
400
401 #endif
402
403 #if !defined(OPAL_HAVE_ATOMIC_MATH_32) && !defined(DOXYGEN)
404
405 #define OPAL_HAVE_ATOMIC_MATH_32 0
406 #endif
407
408 #if defined(DOXYGEN) || OPAL_HAVE_ATOMIC_MATH_32 || OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_32
409
410 static inline int32_t opal_atomic_add_fetch_32(opal_atomic_int32_t *addr, int delta);
411 static inline int32_t opal_atomic_fetch_add_32(opal_atomic_int32_t *addr, int delta);
412 static inline int32_t opal_atomic_and_fetch_32(opal_atomic_int32_t *addr, int32_t value);
413 static inline int32_t opal_atomic_fetch_and_32(opal_atomic_int32_t *addr, int32_t value);
414 static inline int32_t opal_atomic_or_fetch_32(opal_atomic_int32_t *addr, int32_t value);
415 static inline int32_t opal_atomic_fetch_or_32(opal_atomic_int32_t *addr, int32_t value);
416 static inline int32_t opal_atomic_xor_fetch_32(opal_atomic_int32_t *addr, int32_t value);
417 static inline int32_t opal_atomic_fetch_xor_32(opal_atomic_int32_t *addr, int32_t value);
418 static inline int32_t opal_atomic_sub_fetch_32(opal_atomic_int32_t *addr, int delta);
419 static inline int32_t opal_atomic_fetch_sub_32(opal_atomic_int32_t *addr, int delta);
420 static inline int32_t opal_atomic_min_fetch_32 (opal_atomic_int32_t *addr, int32_t value);
421 static inline int32_t opal_atomic_fetch_min_32 (opal_atomic_int32_t *addr, int32_t value);
422 static inline int32_t opal_atomic_max_fetch_32 (opal_atomic_int32_t *addr, int32_t value);
423 static inline int32_t opal_atomic_fetch_max_32 (opal_atomic_int32_t *addr, int32_t value);
424
425 #endif
426
427 #if ! OPAL_HAVE_ATOMIC_MATH_32
428
429 #undef OPAL_HAVE_ATOMIC_MATH_32
430 #define OPAL_HAVE_ATOMIC_MATH_32 OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_32
431 #endif
432
433 #ifndef OPAL_HAVE_ATOMIC_MATH_64
434
435 #define OPAL_HAVE_ATOMIC_MATH_64 0
436 #endif
437
438 #if defined(DOXYGEN) || OPAL_HAVE_ATOMIC_MATH_64 || OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_64
439
440 static inline int64_t opal_atomic_add_fetch_64(opal_atomic_int64_t *addr, int64_t delta);
441 static inline int64_t opal_atomic_fetch_add_64(opal_atomic_int64_t *addr, int64_t delta);
442 static inline int64_t opal_atomic_and_fetch_64(opal_atomic_int64_t *addr, int64_t value);
443 static inline int64_t opal_atomic_fetch_and_64(opal_atomic_int64_t *addr, int64_t value);
444 static inline int64_t opal_atomic_or_fetch_64(opal_atomic_int64_t *addr, int64_t value);
445 static inline int64_t opal_atomic_fetch_or_64(opal_atomic_int64_t *addr, int64_t value);
446 static inline int64_t opal_atomic_fetch_xor_64(opal_atomic_int64_t *addr, int64_t value);
447 static inline int64_t opal_atomic_sub_fetch_64(opal_atomic_int64_t *addr, int64_t delta);
448 static inline int64_t opal_atomic_fetch_sub_64(opal_atomic_int64_t *addr, int64_t delta);
449 static inline int64_t opal_atomic_min_fetch_64 (opal_atomic_int64_t *addr, int64_t value);
450 static inline int64_t opal_atomic_fetch_min_64 (opal_atomic_int64_t *addr, int64_t value);
451 static inline int64_t opal_atomic_max_fetch_64 (opal_atomic_int64_t *addr, int64_t value);
452 static inline int64_t opal_atomic_fetch_max_64 (opal_atomic_int64_t *addr, int64_t value);
453
454 #endif
455
456 #if ! OPAL_HAVE_ATOMIC_MATH_64
457
458 #undef OPAL_HAVE_ATOMIC_MATH_64
459 #define OPAL_HAVE_ATOMIC_MATH_64 OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_64
460 #endif
461
462
463
464
465
466
467 #if defined(DOXYGEN) || OPAL_ENABLE_DEBUG
468 static inline size_t
469 opal_atomic_add_fetch_size_t(opal_atomic_size_t *addr, size_t delta)
470 {
471 #if SIZEOF_SIZE_T == 4
472 return (size_t) opal_atomic_add_fetch_32((int32_t*) addr, delta);
473 #elif SIZEOF_SIZE_T == 8
474 return (size_t) opal_atomic_add_fetch_64((int64_t*) addr, delta);
475 #else
476 #error "Unknown size_t size"
477 #endif
478 }
479
480 static inline size_t
481 opal_atomic_fetch_add_size_t(opal_atomic_size_t *addr, size_t delta)
482 {
483 #if SIZEOF_SIZE_T == 4
484 return (size_t) opal_atomic_fetch_add_32((int32_t*) addr, delta);
485 #elif SIZEOF_SIZE_T == 8
486 return (size_t) opal_atomic_fetch_add_64((int64_t*) addr, delta);
487 #else
488 #error "Unknown size_t size"
489 #endif
490 }
491
492 static inline size_t
493 opal_atomic_sub_fetch_size_t(opal_atomic_size_t *addr, size_t delta)
494 {
495 #if SIZEOF_SIZE_T == 4
496 return (size_t) opal_atomic_sub_fetch_32((int32_t*) addr, delta);
497 #elif SIZEOF_SIZE_T == 8
498 return (size_t) opal_atomic_sub_fetch_64((int64_t*) addr, delta);
499 #else
500 #error "Unknown size_t size"
501 #endif
502 }
503
504 static inline size_t
505 opal_atomic_fetch_sub_size_t(opal_atomic_size_t *addr, size_t delta)
506 {
507 #if SIZEOF_SIZE_T == 4
508 return (size_t) opal_atomic_fetch_sub_32((int32_t*) addr, delta);
509 #elif SIZEOF_SIZE_T == 8
510 return (size_t) opal_atomic_fetch_sub_64((int64_t*) addr, delta);
511 #else
512 #error "Unknown size_t size"
513 #endif
514 }
515
516 #else
517 #if SIZEOF_SIZE_T == 4
518 #define opal_atomic_add_fetch_size_t(addr, delta) ((size_t) opal_atomic_add_fetch_32((opal_atomic_int32_t *) addr, delta))
519 #define opal_atomic_fetch_add_size_t(addr, delta) ((size_t) opal_atomic_fetch_add_32((opal_atomic_int32_t *) addr, delta))
520 #define opal_atomic_sub_fetch_size_t(addr, delta) ((size_t) opal_atomic_sub_fetch_32((opal_atomic_int32_t *) addr, delta))
521 #define opal_atomic_fetch_sub_size_t(addr, delta) ((size_t) opal_atomic_fetch_sub_32((opal_atomic_int32_t *) addr, delta))
522 #elif SIZEOF_SIZE_T == 8
523 #define opal_atomic_add_fetch_size_t(addr, delta) ((size_t) opal_atomic_add_fetch_64((opal_atomic_int64_t *) addr, delta))
524 #define opal_atomic_fetch_add_size_t(addr, delta) ((size_t) opal_atomic_fetch_add_64((opal_atomic_int64_t *) addr, delta))
525 #define opal_atomic_sub_fetch_size_t(addr, delta) ((size_t) opal_atomic_sub_fetch_64((opal_atomic_int64_t *) addr, delta))
526 #define opal_atomic_fetch_sub_size_t(addr, delta) ((size_t) opal_atomic_fetch_sub_64((opal_atomic_int64_t *) addr, delta))
527 #else
528 #error "Unknown size_t size"
529 #endif
530 #endif
531
532 #if defined(DOXYGEN) || (OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_32 || OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_64)
533
534
535
536 static inline bool opal_atomic_compare_exchange_strong_xx (opal_atomic_intptr_t *addr, intptr_t *oldval,
537 int64_t newval, size_t length);
538 static inline bool opal_atomic_compare_exchange_strong_acq_xx (opal_atomic_intptr_t *addr, intptr_t *oldval,
539 int64_t newval, size_t length);
540 static inline bool opal_atomic_compare_exchange_strong_rel_xx (opal_atomic_intptr_t *addr, intptr_t *oldval,
541 int64_t newval, size_t length);
542
543
544 static inline bool opal_atomic_compare_exchange_strong_ptr (opal_atomic_intptr_t* addr, intptr_t *oldval,
545 intptr_t newval);
546 static inline bool opal_atomic_compare_exchange_strong_acq_ptr (opal_atomic_intptr_t* addr, intptr_t *oldval,
547 intptr_t newval);
548 static inline bool opal_atomic_compare_exchange_strong_rel_ptr (opal_atomic_intptr_t* addr, intptr_t *oldval,
549 intptr_t newval);
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564 #define opal_atomic_compare_exchange_strong( ADDR, OLDVAL, NEWVAL ) \
565 opal_atomic_compare_exchange_strong_xx( (opal_atomic_intptr_t*)(ADDR), (intptr_t *)(OLDVAL), \
566 (intptr_t)(NEWVAL), sizeof(*(ADDR)) )
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581 #define opal_atomic_compare_exchange_strong_acq( ADDR, OLDVAL, NEWVAL ) \
582 opal_atomic_compare_exchange_strong_acq_xx( (opal_atomic_intptr_t*)(ADDR), (intptr_t *)(OLDVAL), \
583 (intptr_t)(NEWVAL), sizeof(*(ADDR)) )
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598 #define opal_atomic_compare_exchange_strong_rel( ADDR, OLDVAL, NEWVAL ) \
599 opal_atomic_compare_exchange_strong_rel_xx( (opal_atomic_intptr_t*)(ADDR), (intptr_t *)(OLDVAL), \
600 (intptr_t)(NEWVAL), sizeof(*(ADDR)) )
601
602
603 #endif
604
605 #if defined(DOXYGEN) || (OPAL_HAVE_ATOMIC_MATH_32 || OPAL_HAVE_ATOMIC_MATH_64)
606
607 static inline void opal_atomic_add_xx(opal_atomic_intptr_t* addr,
608 int32_t value, size_t length);
609 static inline void opal_atomic_sub_xx(opal_atomic_intptr_t* addr,
610 int32_t value, size_t length);
611
612 static inline intptr_t opal_atomic_add_fetch_ptr( opal_atomic_intptr_t* addr, void* delta );
613 static inline intptr_t opal_atomic_fetch_add_ptr( opal_atomic_intptr_t* addr, void* delta );
614 static inline intptr_t opal_atomic_sub_fetch_ptr( opal_atomic_intptr_t* addr, void* delta );
615 static inline intptr_t opal_atomic_fetch_sub_ptr( opal_atomic_intptr_t* addr, void* delta );
616
617
618
619
620
621
622
623
624
625
626
627 #define opal_atomic_add( ADDR, VALUE ) \
628 opal_atomic_add_xx( (opal_atomic_intptr_t*)(ADDR), (int32_t)(VALUE), \
629 sizeof(*(ADDR)) )
630
631
632
633
634
635
636
637
638
639
640
641 #define opal_atomic_sub( ADDR, VALUE ) \
642 opal_atomic_sub_xx( (opal_atomic_intptr_t*)(ADDR), (int32_t)(VALUE), \
643 sizeof(*(ADDR)) )
644
645 #endif
646
647
648
649
650
651
652 #include "opal/sys/atomic_impl.h"
653
654 #endif
655
656 END_C_DECLS
657
658 #endif