38#ifndef _RTEMS_SCORE_ATOMIC_H
39#define _RTEMS_SCORE_ATOMIC_H
59 #if defined(__cplusplus) \
60 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9))
70 #define _RTEMS_SCORE_ATOMIC_USE_ATOMIC
72 #include <stdatomic.h>
73 #define _RTEMS_SCORE_ATOMIC_USE_STDATOMIC
79#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
81typedef unsigned int Atomic_Uint;
83typedef unsigned long Atomic_Ulong;
85typedef uintptr_t Atomic_Uintptr;
87typedef std::atomic_flag Atomic_Flag;
89typedef std::memory_order Atomic_Order;
91#define ATOMIC_ORDER_RELAXED std::memory_order_relaxed
93#define ATOMIC_ORDER_ACQUIRE std::memory_order_acquire
95#define ATOMIC_ORDER_RELEASE std::memory_order_release
97#define ATOMIC_ORDER_ACQ_REL std::memory_order_acq_rel
99#define ATOMIC_ORDER_SEQ_CST std::memory_order_seq_cst
101#define ATOMIC_INITIALIZER_UINT( value ) ATOMIC_VAR_INIT( value )
103#define ATOMIC_INITIALIZER_ULONG( value ) ATOMIC_VAR_INIT( value )
105#define ATOMIC_INITIALIZER_UINTPTR( value ) ATOMIC_VAR_INIT( value )
107#define ATOMIC_INITIALIZER_FLAG ATOMIC_FLAG_INIT
109#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
111typedef atomic_uint Atomic_Uint;
113typedef atomic_ulong Atomic_Ulong;
115typedef atomic_uintptr_t Atomic_Uintptr;
117typedef atomic_flag Atomic_Flag;
119typedef memory_order Atomic_Order;
121#define ATOMIC_ORDER_RELAXED memory_order_relaxed
123#define ATOMIC_ORDER_ACQUIRE memory_order_acquire
125#define ATOMIC_ORDER_RELEASE memory_order_release
127#define ATOMIC_ORDER_ACQ_REL memory_order_acq_rel
129#define ATOMIC_ORDER_SEQ_CST memory_order_seq_cst
131#define ATOMIC_INITIALIZER_UINT( value ) ATOMIC_VAR_INIT( value )
133#define ATOMIC_INITIALIZER_ULONG( value ) ATOMIC_VAR_INIT( value )
135#define ATOMIC_INITIALIZER_UINTPTR( value ) ATOMIC_VAR_INIT( value )
137#define ATOMIC_INITIALIZER_FLAG ATOMIC_FLAG_INIT
141typedef unsigned int Atomic_Uint;
143typedef unsigned long Atomic_Ulong;
145typedef uintptr_t Atomic_Uintptr;
147typedef bool Atomic_Flag;
149typedef int Atomic_Order;
151#define ATOMIC_ORDER_RELAXED 0
153#define ATOMIC_ORDER_ACQUIRE 2
155#define ATOMIC_ORDER_RELEASE 3
157#define ATOMIC_ORDER_ACQ_REL 4
159#define ATOMIC_ORDER_SEQ_CST 5
161#define ATOMIC_INITIALIZER_UINT( value ) ( value )
163#define ATOMIC_INITIALIZER_ULONG( value ) ( value )
165#define ATOMIC_INITIALIZER_UINTPTR( value ) ( value )
167#define ATOMIC_INITIALIZER_FLAG false
176static inline void _Atomic_Fence( Atomic_Order order )
178#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
179 std::atomic_thread_fence( order );
180#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
181 atomic_thread_fence( order );
194static inline void _Atomic_Init_uint( Atomic_Uint *obj,
unsigned int desired )
196#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
197 reinterpret_cast<std::atomic_uint *
>( obj )->store( desired );
198#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
199 atomic_init( obj, desired );
211static inline void _Atomic_Init_ulong( Atomic_Ulong *obj,
unsigned long desired )
213#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
214 reinterpret_cast<std::atomic_ulong *
>( obj )->store( desired );
215#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
216 atomic_init( obj, desired );
228static inline void _Atomic_Init_uintptr( Atomic_Uintptr *obj, uintptr_t desired )
230#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
231 reinterpret_cast<std::atomic_uintptr_t *
>( obj )->store( desired );
232#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
233 atomic_init( obj, desired );
247static inline unsigned int _Atomic_Load_uint(
const Atomic_Uint *obj, Atomic_Order order )
249#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
250 return reinterpret_cast<const std::atomic_uint *
>( obj )->load( order );
251#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
252 return atomic_load_explicit( obj, order );
272static inline unsigned long _Atomic_Load_ulong(
const Atomic_Ulong *obj, Atomic_Order order )
274#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
275 return reinterpret_cast<const std::atomic_ulong *
>( obj )->load( order );
276#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
277 return atomic_load_explicit( obj, order );
297static inline uintptr_t _Atomic_Load_uintptr(
const Atomic_Uintptr *obj, Atomic_Order order )
299#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
300 return reinterpret_cast<const std::atomic_uintptr_t *
>( obj )->load( order );
301#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
302 return atomic_load_explicit( obj, order );
321static inline void _Atomic_Store_uint( Atomic_Uint *obj,
unsigned int desired, Atomic_Order order )
323#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
324 reinterpret_cast<std::atomic_uint *
>( obj )->store( desired, order );
325#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
326 atomic_store_explicit( obj, desired, order );
341static inline void _Atomic_Store_ulong( Atomic_Ulong *obj,
unsigned long desired, Atomic_Order order )
343#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
344 reinterpret_cast<std::atomic_ulong *
>( obj )->store( desired, order );
345#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
346 atomic_store_explicit( obj, desired, order );
361static inline void _Atomic_Store_uintptr( Atomic_Uintptr *obj, uintptr_t desired, Atomic_Order order )
363#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
364 reinterpret_cast<std::atomic_uintptr_t *
>( obj )->store( desired, order );
365#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
366 atomic_store_explicit( obj, desired, order );
383static inline unsigned int _Atomic_Fetch_add_uint( Atomic_Uint *obj,
unsigned int arg, Atomic_Order order )
385#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
386 return reinterpret_cast<std::atomic_uint *
>( obj )->fetch_add( arg, order );
387#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
388 return atomic_fetch_add_explicit( obj, arg, order );
412static inline unsigned long _Atomic_Fetch_add_ulong( Atomic_Ulong *obj,
unsigned long arg, Atomic_Order order )
414#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
415 return reinterpret_cast<std::atomic_ulong *
>( obj )->fetch_add( arg, order );
416#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
417 return atomic_fetch_add_explicit( obj, arg, order );
441static inline uintptr_t _Atomic_Fetch_add_uintptr( Atomic_Uintptr *obj, uintptr_t arg, Atomic_Order order )
443#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
444 return reinterpret_cast<std::atomic_uintptr_t *
>( obj )->fetch_add( arg, order );
445#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
446 return atomic_fetch_add_explicit( obj, arg, order );
470static inline unsigned int _Atomic_Fetch_sub_uint( Atomic_Uint *obj,
unsigned int arg, Atomic_Order order )
472#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
473 return reinterpret_cast<std::atomic_uint *
>( obj )->fetch_sub( arg, order );
474#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
475 return atomic_fetch_sub_explicit( obj, arg, order );
499static inline unsigned long _Atomic_Fetch_sub_ulong( Atomic_Ulong *obj,
unsigned long arg, Atomic_Order order )
501#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
502 return reinterpret_cast<std::atomic_ulong *
>( obj )->fetch_sub( arg, order );
503#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
504 return atomic_fetch_sub_explicit( obj, arg, order );
528static inline uintptr_t _Atomic_Fetch_sub_uintptr( Atomic_Uintptr *obj, uintptr_t arg, Atomic_Order order )
530#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
531 return reinterpret_cast<std::atomic_uintptr_t *
>( obj )->fetch_sub( arg, order );
532#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
533 return atomic_fetch_sub_explicit( obj, arg, order );
557static inline unsigned int _Atomic_Fetch_or_uint( Atomic_Uint *obj,
unsigned int arg, Atomic_Order order )
559#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
560 return reinterpret_cast<std::atomic_uint *
>( obj )->fetch_or( arg, order );
561#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
562 return atomic_fetch_or_explicit( obj, arg, order );
586static inline unsigned long _Atomic_Fetch_or_ulong( Atomic_Ulong *obj,
unsigned long arg, Atomic_Order order )
588#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
589 return reinterpret_cast<std::atomic_ulong *
>( obj )->fetch_or( arg, order );
590#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
591 return atomic_fetch_or_explicit( obj, arg, order );
615static inline uintptr_t _Atomic_Fetch_or_uintptr( Atomic_Uintptr *obj, uintptr_t arg, Atomic_Order order )
617#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
618 return reinterpret_cast<std::atomic_uintptr_t *
>( obj )->fetch_or( arg, order );
619#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
620 return atomic_fetch_or_explicit( obj, arg, order );
644static inline unsigned int _Atomic_Fetch_and_uint( Atomic_Uint *obj,
unsigned int arg, Atomic_Order order )
646#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
647 return reinterpret_cast<std::atomic_uint *
>( obj )->fetch_and( arg, order );
648#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
649 return atomic_fetch_and_explicit( obj, arg, order );
673static inline unsigned long _Atomic_Fetch_and_ulong( Atomic_Ulong *obj,
unsigned long arg, Atomic_Order order )
675#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
676 return reinterpret_cast<std::atomic_ulong *
>( obj )->fetch_and( arg, order );
677#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
678 return atomic_fetch_and_explicit( obj, arg, order );
702static inline uintptr_t _Atomic_Fetch_and_uintptr( Atomic_Uintptr *obj, uintptr_t arg, Atomic_Order order )
704#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
705 return reinterpret_cast<std::atomic_uintptr_t *
>( obj )->fetch_and( arg, order );
706#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
707 return atomic_fetch_and_explicit( obj, arg, order );
731static inline unsigned int _Atomic_Exchange_uint( Atomic_Uint *obj,
unsigned int desired, Atomic_Order order )
733#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
734 return reinterpret_cast<std::atomic_uint *
>( obj )->exchange( desired, order );
735#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
736 return atomic_exchange_explicit( obj, desired, order );
760static inline unsigned long _Atomic_Exchange_ulong( Atomic_Ulong *obj,
unsigned long desired, Atomic_Order order )
762#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
763 return reinterpret_cast<std::atomic_ulong *
>( obj )->exchange( desired, order );
764#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
765 return atomic_exchange_explicit( obj, desired, order );
789static inline uintptr_t _Atomic_Exchange_uintptr( Atomic_Uintptr *obj, uintptr_t desired, Atomic_Order order )
791#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
792 return reinterpret_cast<std::atomic_uintptr_t *
>( obj )->exchange( desired, order );
793#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
794 return atomic_exchange_explicit( obj, desired, order );
826static inline bool _Atomic_Compare_exchange_uint( Atomic_Uint *obj,
unsigned int *expected,
unsigned int desired, Atomic_Order succ, Atomic_Order fail )
828#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
829 return reinterpret_cast<std::atomic_uint *
>( obj )->compare_exchange_strong( *expected, desired, succ, fail );
830#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
831 return atomic_compare_exchange_strong_explicit( obj, expected, desired, succ, fail );
841 success = ( actual == *expected );
870static inline bool _Atomic_Compare_exchange_ulong( Atomic_Ulong *obj,
unsigned long *expected,
unsigned long desired, Atomic_Order succ, Atomic_Order fail )
872#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
873 return reinterpret_cast<std::atomic_ulong *
>( obj )->compare_exchange_strong( *expected, desired, succ, fail );
874#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
875 return atomic_compare_exchange_strong_explicit( obj, expected, desired, succ, fail );
879 unsigned long actual;
885 success = ( actual == *expected );
914static inline bool _Atomic_Compare_exchange_uintptr( Atomic_Uintptr *obj, uintptr_t *expected, uintptr_t desired, Atomic_Order succ, Atomic_Order fail )
916#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
917 return reinterpret_cast<std::atomic_uintptr_t *
>( obj )->compare_exchange_strong( *expected, desired, succ, fail );
918#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
919 return atomic_compare_exchange_strong_explicit( obj, expected, desired, succ, fail );
929 success = ( actual == *expected );
947static inline void _Atomic_Flag_clear( Atomic_Flag *obj, Atomic_Order order )
949#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
951#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
952 atomic_flag_clear_explicit( obj, order );
968static inline bool _Atomic_Flag_test_and_set( Atomic_Flag *obj, Atomic_Order order )
970#if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
971 return obj->test_and_set( order );
972#elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
973 return atomic_flag_test_and_set_explicit( obj, order );
This header file provides basic definitions used by the API and the implementation.
#define RTEMS_COMPILER_MEMORY_BARRIER()
This macro forbids the compiler to reorder read and write commands around it.
Definition: basedefs.h:258
#define _ISR_Local_disable(_level)
Disables interrupts on this processor.
Definition: isrlevel.h:76
#define _ISR_Local_enable(_level)
Enables interrupts on this processor.
Definition: isrlevel.h:93
uint32_t ISR_Level
Definition: isrlevel.h:60
This header file provides the ISR_Level related interfaces of the ISR Handler.