16 #ifndef _RTEMS_SCORE_CPUSTDATOMIC_H 17 #define _RTEMS_SCORE_CPUSTDATOMIC_H 22 #if defined(__cplusplus) \ 23 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9)) 33 #define _RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC 35 #include <stdatomic.h> 36 #define _RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC 42 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 44 typedef std::atomic_uint CPU_atomic_Uint;
46 typedef std::atomic_ulong CPU_atomic_Ulong;
48 typedef std::atomic_uintptr_t CPU_atomic_Pointer;
50 typedef std::atomic_flag CPU_atomic_Flag;
52 typedef std::memory_order CPU_atomic_Order;
54 #define CPU_ATOMIC_ORDER_RELAXED std::memory_order_relaxed 56 #define CPU_ATOMIC_ORDER_ACQUIRE std::memory_order_acquire 58 #define CPU_ATOMIC_ORDER_RELEASE std::memory_order_release 60 #define CPU_ATOMIC_ORDER_ACQ_REL std::memory_order_acq_rel 62 #define CPU_ATOMIC_ORDER_SEQ_CST std::memory_order_seq_cst 64 #define CPU_ATOMIC_INITIALIZER_UINT( value ) ATOMIC_VAR_INIT( value ) 66 #define CPU_ATOMIC_INITIALIZER_ULONG( value ) ATOMIC_VAR_INIT( value ) 68 #define CPU_ATOMIC_INITIALIZER_PTR( value ) \ 69 ATOMIC_VAR_INIT( (uintptr_t) (value) ) 71 #define CPU_ATOMIC_INITIALIZER_FLAG ATOMIC_FLAG_INIT 73 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 75 typedef atomic_uint CPU_atomic_Uint;
77 typedef atomic_ulong CPU_atomic_Ulong;
79 typedef atomic_uintptr_t CPU_atomic_Pointer;
81 typedef atomic_flag CPU_atomic_Flag;
83 typedef memory_order CPU_atomic_Order;
85 #define CPU_ATOMIC_ORDER_RELAXED memory_order_relaxed 87 #define CPU_ATOMIC_ORDER_ACQUIRE memory_order_acquire 89 #define CPU_ATOMIC_ORDER_RELEASE memory_order_release 91 #define CPU_ATOMIC_ORDER_ACQ_REL memory_order_acq_rel 93 #define CPU_ATOMIC_ORDER_SEQ_CST memory_order_seq_cst 95 #define CPU_ATOMIC_INITIALIZER_UINT( value ) ATOMIC_VAR_INIT( value ) 97 #define CPU_ATOMIC_INITIALIZER_ULONG( value ) ATOMIC_VAR_INIT( value ) 99 #define CPU_ATOMIC_INITIALIZER_PTR( value ) \ 100 ATOMIC_VAR_INIT( (uintptr_t) (value) ) 102 #define CPU_ATOMIC_INITIALIZER_FLAG ATOMIC_FLAG_INIT 106 typedef unsigned int CPU_atomic_Uint;
108 typedef unsigned long CPU_atomic_Ulong;
110 typedef uintptr_t CPU_atomic_Pointer;
112 typedef bool CPU_atomic_Flag;
114 typedef int CPU_atomic_Order;
116 #define CPU_ATOMIC_ORDER_RELAXED 0 118 #define CPU_ATOMIC_ORDER_ACQUIRE 2 120 #define CPU_ATOMIC_ORDER_RELEASE 3 122 #define CPU_ATOMIC_ORDER_ACQ_REL 4 124 #define CPU_ATOMIC_ORDER_SEQ_CST 5 126 #define CPU_ATOMIC_INITIALIZER_UINT( value ) ( value ) 128 #define CPU_ATOMIC_INITIALIZER_ULONG( value ) ( value ) 130 #define CPU_ATOMIC_INITIALIZER_PTR( value ) ( (uintptr_t) (value) ) 132 #define CPU_ATOMIC_INITIALIZER_FLAG false 136 static inline void _CPU_atomic_Fence( CPU_atomic_Order order )
138 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 139 std::atomic_thread_fence( order );
140 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 141 atomic_thread_fence( order );
148 static inline void _CPU_atomic_Init_uint( CPU_atomic_Uint *obj,
unsigned int desired )
150 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 151 obj->store( desired );
152 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 153 atomic_init( obj, desired );
159 static inline void _CPU_atomic_Init_ulong( CPU_atomic_Ulong *obj,
unsigned long desired )
161 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 162 obj->store( desired );
163 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 164 atomic_init( obj, desired );
170 static inline void _CPU_atomic_Init_ptr( CPU_atomic_Pointer *obj,
void *desired )
172 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 173 obj->store( (uintptr_t) desired );
174 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 175 atomic_init( obj, (uintptr_t) desired );
177 *obj = (uintptr_t) desired;
181 static inline unsigned int _CPU_atomic_Load_uint(
const CPU_atomic_Uint *obj, CPU_atomic_Order order )
183 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 184 return obj->load( order );
185 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 186 return atomic_load_explicit( obj, order );
198 static inline unsigned long _CPU_atomic_Load_ulong(
const CPU_atomic_Ulong *obj, CPU_atomic_Order order )
200 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 201 return obj->load( order );
202 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 203 return atomic_load_explicit( obj, order );
215 static inline void *_CPU_atomic_Load_ptr(
const CPU_atomic_Pointer *obj, CPU_atomic_Order order )
217 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 218 return (
void *) obj->load( order );
219 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 220 return (
void *) atomic_load_explicit( obj, order );
232 static inline void _CPU_atomic_Store_uint( CPU_atomic_Uint *obj,
unsigned int desired, CPU_atomic_Order order )
234 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 235 obj->store( desired );
236 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 237 atomic_store_explicit( obj, desired, order );
245 static inline void _CPU_atomic_Store_ulong( CPU_atomic_Ulong *obj,
unsigned long desired, CPU_atomic_Order order )
247 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 248 obj->store( desired );
249 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 250 atomic_store_explicit( obj, desired, order );
258 static inline void _CPU_atomic_Store_ptr( CPU_atomic_Pointer *obj,
void *desired, CPU_atomic_Order order )
260 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 261 obj->store( (uintptr_t) desired );
262 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 263 atomic_store_explicit( obj, (uintptr_t) desired, order );
267 *obj = (uintptr_t) desired;
271 static inline unsigned int _CPU_atomic_Fetch_add_uint( CPU_atomic_Uint *obj,
unsigned int arg, CPU_atomic_Order order )
273 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 274 return obj->fetch_add( arg, order );
275 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 276 return atomic_fetch_add_explicit( obj, arg, order );
291 static inline unsigned long _CPU_atomic_Fetch_add_ulong( CPU_atomic_Ulong *obj,
unsigned long arg, CPU_atomic_Order order )
293 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 294 return obj->fetch_add( arg, order );
295 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 296 return atomic_fetch_add_explicit( obj, arg, order );
311 static inline void *_CPU_atomic_Fetch_add_ptr( CPU_atomic_Pointer *obj,
void *arg, CPU_atomic_Order order )
313 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 314 return (
void *) obj->fetch_add( (uintptr_t) arg, order );
315 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 316 return (
void *) atomic_fetch_add_explicit( obj, (uintptr_t) arg, order );
324 *obj = val + (uintptr_t) arg;
331 static inline unsigned int _CPU_atomic_Fetch_sub_uint( CPU_atomic_Uint *obj,
unsigned int arg, CPU_atomic_Order order )
333 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 334 return obj->fetch_sub( arg, order );
335 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 336 return atomic_fetch_sub_explicit( obj, arg, order );
351 static inline unsigned long _CPU_atomic_Fetch_sub_ulong( CPU_atomic_Ulong *obj,
unsigned long arg, CPU_atomic_Order order )
353 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 354 return obj->fetch_sub( arg, order );
355 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 356 return atomic_fetch_sub_explicit( obj, arg, order );
371 static inline void *_CPU_atomic_Fetch_sub_ptr( CPU_atomic_Pointer *obj,
void *arg, CPU_atomic_Order order )
373 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 374 return (
void *) obj->fetch_sub( (uintptr_t) arg, order );
375 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 376 return (
void *) atomic_fetch_sub_explicit( obj, (uintptr_t) arg, order );
384 *obj = val - (uintptr_t) arg;
391 static inline unsigned int _CPU_atomic_Fetch_or_uint( CPU_atomic_Uint *obj,
unsigned int arg, CPU_atomic_Order order )
393 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 394 return obj->fetch_or( arg, order );
395 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 396 return atomic_fetch_or_explicit( obj, arg, order );
411 static inline unsigned long _CPU_atomic_Fetch_or_ulong( CPU_atomic_Ulong *obj,
unsigned long arg, CPU_atomic_Order order )
413 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 414 return obj->fetch_or( arg, order );
415 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 416 return atomic_fetch_or_explicit( obj, arg, order );
431 static inline void *_CPU_atomic_Fetch_or_ptr( CPU_atomic_Pointer *obj,
void *arg, CPU_atomic_Order order )
433 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 434 return (
void *) obj->fetch_or( (uintptr_t) arg, order );
435 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 436 return (
void *) atomic_fetch_or_explicit( obj, (uintptr_t) arg, order );
444 *obj = val | (uintptr_t) arg;
451 static inline unsigned int _CPU_atomic_Fetch_and_uint( CPU_atomic_Uint *obj,
unsigned int arg, CPU_atomic_Order order )
453 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 454 return obj->fetch_and( arg, order );
455 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 456 return atomic_fetch_and_explicit( obj, arg, order );
471 static inline unsigned long _CPU_atomic_Fetch_and_ulong( CPU_atomic_Ulong *obj,
unsigned long arg, CPU_atomic_Order order )
473 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 474 return obj->fetch_and( arg, order );
475 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 476 return atomic_fetch_and_explicit( obj, arg, order );
491 static inline void *_CPU_atomic_Fetch_and_ptr( CPU_atomic_Pointer *obj,
void *arg, CPU_atomic_Order order )
493 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 494 return (
void *) obj->fetch_and( (uintptr_t) arg, order );
495 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 496 return (
void *) atomic_fetch_and_explicit( obj, (uintptr_t) arg, order );
504 *obj = val & (uintptr_t) arg;
511 static inline unsigned int _CPU_atomic_Exchange_uint( CPU_atomic_Uint *obj,
unsigned int desired, CPU_atomic_Order order )
513 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 514 return obj->exchange( desired, order );
515 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 516 return atomic_exchange_explicit( obj, desired, order );
531 static inline unsigned long _CPU_atomic_Exchange_ulong( CPU_atomic_Ulong *obj,
unsigned long desired, CPU_atomic_Order order )
533 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 534 return obj->exchange( desired, order );
535 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 536 return atomic_exchange_explicit( obj, desired, order );
551 static inline void *_CPU_atomic_Exchange_ptr( CPU_atomic_Pointer *obj,
void *desired, CPU_atomic_Order order )
553 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 554 return (
void *) obj->exchange( (uintptr_t) desired, order );
555 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 556 return (
void *) atomic_exchange_explicit( obj, (uintptr_t) desired, order );
564 *obj = (uintptr_t) desired;
571 static inline bool _CPU_atomic_Compare_exchange_uint( CPU_atomic_Uint *obj,
unsigned int *expected,
unsigned int desired, CPU_atomic_Order succ, CPU_atomic_Order fail )
573 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 574 return obj->compare_exchange_strong( *expected, desired, succ, fail );
575 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 576 return atomic_compare_exchange_strong_explicit( obj, expected, desired, succ, fail );
584 success = *obj == *expected;
594 static inline bool _CPU_atomic_Compare_exchange_ulong( CPU_atomic_Ulong *obj,
unsigned long *expected,
unsigned long desired, CPU_atomic_Order succ, CPU_atomic_Order fail )
596 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 597 return obj->compare_exchange_strong( *expected, desired, succ, fail );
598 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 599 return atomic_compare_exchange_strong_explicit( obj, expected, desired, succ, fail );
607 success = *obj == *expected;
617 static inline bool _CPU_atomic_Compare_exchange_ptr( CPU_atomic_Pointer *obj,
void **expected,
void *desired, CPU_atomic_Order succ, CPU_atomic_Order fail )
619 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 620 return obj->compare_exchange_strong( *(uintptr_t *) expected, (uintptr_t) desired, succ, fail );
621 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 622 return atomic_compare_exchange_strong_explicit( obj, (uintptr_t *) expected, (uintptr_t) desired, succ, fail );
630 success = *obj == (uintptr_t) *expected;
632 *obj = (uintptr_t) desired;
640 static inline void _CPU_atomic_Flag_clear( CPU_atomic_Flag *obj, CPU_atomic_Order order )
642 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 644 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 645 atomic_flag_clear_explicit( obj, order );
652 static inline bool _CPU_atomic_Flag_test_and_set( CPU_atomic_Flag *obj, CPU_atomic_Order order )
654 #if defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_ATOMIC) 655 return obj->test_and_set( order );
656 #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) 657 return atomic_flag_test_and_set_explicit( obj, order );
uint32_t ISR_Level
The following type defines the control block used to manage the interrupt level portion of the status...
Definition: isrlevel.h:42
#define _ISR_Enable(_level)
Enables interrupts on this processor.
Definition: isrlevel.h:76
#define _ISR_Disable(_level)
Disables interrupts on this processor.
Definition: isrlevel.h:58
#define RTEMS_COMPILER_MEMORY_BARRIER()
The following macro is a compiler specific way to ensure that memory writes are not reordered around ...
Definition: basedefs.h:146