/** * @file rtems/score/atomic.h * * This include file defines the interface for all the atomic * operations which can be used in the synchronization primitives * or in the lock-less algorithms. You should not use these API * in the other components directly. */ /* * COPYRIGHT (c) 2012-2013 Deng Hengyi. * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. */ #ifndef _RTEMS_SCORE_ATOMIC_H #define _RTEMS_SCORE_ATOMIC_H #include #ifdef __cplusplus extern "C" { #endif /** * @defgroup RTEMS atomic interface * */ /**@{*/ /** * @brief Atomically load an atomic type value from atomic object. * * @param object an atomic type pointer of object. * @param order a type of Atomic_Order. * * The order shall not be ATOMIC_ORDER_RELEASE. */ RTEMS_INLINE_ROUTINE uint_fast32_t _Atomic_Load_uint( volatile Atomic_Uint *object, Atomic_Order order ) { return _CPU_atomic_Load_uint( object, order ); } RTEMS_INLINE_ROUTINE uintptr_t _Atomic_Load_ptr( volatile Atomic_Pointer *object, Atomic_Order order ) { return _CPU_atomic_Load_ptr( object, order ); } /** * @brief Atomically store an atomic type value into a atomic object. * * @param object an atomic type pointer of object. * @param value a value to be stored into object. * @param order a type of Atomic_Order. * * The order shall not be ATOMIC_ORDER_ACQUIRE. */ RTEMS_INLINE_ROUTINE void _Atomic_Store_uint( volatile Atomic_Uint *object, uint_fast32_t value, Atomic_Order order ) { _CPU_atomic_Store_uint( object, value, order ); } RTEMS_INLINE_ROUTINE void _Atomic_Store_ptr( volatile Atomic_Pointer *object, uintptr_t value, Atomic_Order order ) { _CPU_atomic_Store_ptr( object, value, order ); } /** * @brief Atomically load-add-store an atomic type value into object * * @param object a atomic type pointer of object. * @param value a value to be add and store into object. * @param order a type of Atomic_Order. * * @retval a result value after add ops. */ RTEMS_INLINE_ROUTINE uint_fast32_t _Atomic_Fetch_add_uint( volatile Atomic_Uint *object, uint_fast32_t value, Atomic_Order order ) { return _CPU_atomic_Fetch_add_uint( object, value, order ); } RTEMS_INLINE_ROUTINE uintptr_t _Atomic_Fetch_add_ptr( volatile Atomic_Pointer *object, uintptr_t value, Atomic_Order order ) { return _CPU_atomic_Fetch_add_ptr( object, value, order ); } /** * @brief Atomically load-sub-store an atomic type value into object * * @param object a atomic type pointer of object. * @param value a value to be sub and store into object. * @param order a type of Atomic_Order. * * @retval a result value after sub ops. */ RTEMS_INLINE_ROUTINE uint_fast32_t _Atomic_Fetch_sub_uint( volatile Atomic_Uint *object, uint_fast32_t value, Atomic_Order order ) { return _CPU_atomic_Fetch_sub_uint( object, value, order ); } RTEMS_INLINE_ROUTINE uintptr_t _Atomic_Fetch_sub_ptr( volatile Atomic_Pointer *object, uintptr_t value, Atomic_Order order ) { return _CPU_atomic_Fetch_sub_ptr( object, value, order ); } /** * @brief Atomically load-or-store an atomic type value into object * * @param object a atomic type pointer of object. * @param value a value to be or and store into object. * @param order a type of Atomic_Order. * * @retval a result value after or ops. */ RTEMS_INLINE_ROUTINE uint_fast32_t _Atomic_Fetch_or_uint( volatile Atomic_Uint *object, uint_fast32_t value, Atomic_Order order ) { return _CPU_atomic_Fetch_or_uint( object, value, order ); } RTEMS_INLINE_ROUTINE uintptr_t _Atomic_Fetch_or_ptr( volatile Atomic_Pointer *object, uintptr_t value, Atomic_Order order ) { return _CPU_atomic_Fetch_or_ptr( object, value, order ); } /** * @brief Atomically load-and-store an atomic type value into object * * @param object a atomic type pointer of object. * @param value a value to be and and store into object. * @param order a type of Atomic_Order. * * @retval a result value after and ops. */ RTEMS_INLINE_ROUTINE uint_fast32_t _Atomic_Fetch_and_uint( volatile Atomic_Uint *object, uint_fast32_t value, Atomic_Order order ) { return _CPU_atomic_Fetch_and_uint( object, value, order ); } RTEMS_INLINE_ROUTINE uintptr_t _Atomic_Fetch_and_ptr( volatile Atomic_Pointer *object, uintptr_t value, Atomic_Order order ) { return _CPU_atomic_Fetch_and_ptr( object, value, order ); } /** * @brief Atomically exchange an atomic type value into object * * @param object a atomic type pointer of object. * @param value a value to exchange and and store into object. * @param order a type of Atomic_Order. * * @retval a result value after exchange ops. */ RTEMS_INLINE_ROUTINE uint_fast32_t _Atomic_Exchange_uint( volatile Atomic_Uint *object, uint_fast32_t value, Atomic_Order order ) { return _CPU_atomic_Exchange_uint( object, value, order ); } RTEMS_INLINE_ROUTINE uintptr_t _Atomic_Exchange_ptr( volatile Atomic_Pointer *object, uintptr_t value, Atomic_Order order ) { return _CPU_atomic_Exchange_ptr( object, value, order ); } /** * @brief Atomically compare the value stored at object with a * old_value and if the two values are equal, update the value of a * address with a new_value * * @param object a atomic type pointer of object. * @param old_value pointer of a value. * @param new_value a atomic type value. * @param order_succ a type of Atomic_Order for successful exchange. * @param order_fail a type of Atomic_Order for failed exchange. * * @retval true if the compare exchange successully. * @retval false if the compare exchange failed. */ RTEMS_INLINE_ROUTINE bool _Atomic_Compare_exchange_uint( volatile Atomic_Uint *object, uint_fast32_t *old_value, uint_fast32_t new_value, Atomic_Order order_succ, Atomic_Order order_fail ) { return _CPU_atomic_Compare_exchange_uint( object, old_value, new_value, order_succ, order_fail ); } RTEMS_INLINE_ROUTINE bool _Atomic_Compare_exchange_ptr( volatile Atomic_Pointer *object, uintptr_t *old_value, uintptr_t new_value, Atomic_Order order_succ, Atomic_Order order_fail ) { return _CPU_atomic_Compare_exchange_ptr( object, old_value, new_value, order_succ, order_fail ); } /** * @brief Atomically clear the value of an atomic flag type object. * * @param[in, out] object an atomic flag type pointer of object. * @param order a type of Atomic_Order. * */ RTEMS_INLINE_ROUTINE void _Atomic_Clear_flag( volatile Atomic_Flag *object, Atomic_Order order ) { _CPU_atomic_Clear_flag( object, order ); } /** * @brief Atomically test and clear the value of an atomic flag type object. * * @param[in, out] object an atomic flag type pointer of object. * @param order a type of Atomic_Order. * * @retval true if the test and set successully. * @retval false if the test and set failed. */ RTEMS_INLINE_ROUTINE bool _Atomic_Test_set_flag( volatile Atomic_Flag *object, Atomic_Order order ) { return _CPU_atomic_Test_set_flag( object, order ); } #ifdef __cplusplus } #endif /**@}*/ #endif /* end of include file */