17#ifndef _RTEMS_SCORE_SMPLOCKSEQ_H
18#define _RTEMS_SCORE_SMPLOCKSEQ_H
20#include <rtems/score/cpuopts.h>
57} SMP_sequence_lock_Control;
62#define SMP_SEQUENCE_LOCK_INITIALIZER { ATOMIC_INITIALIZER_UINT( 0 ) }
71static inline void _SMP_sequence_lock_Initialize( SMP_sequence_lock_Control *lock )
73 _Atomic_Init_uint( &lock->sequence, 0 );
83static inline void _SMP_sequence_lock_Destroy( SMP_sequence_lock_Control *lock )
99static inline unsigned int _SMP_sequence_lock_Write_begin(
100 SMP_sequence_lock_Control *lock
105 seq = _Atomic_Load_uint( &lock->sequence, ATOMIC_ORDER_RELAXED );
108 _Atomic_Store_uint( &lock->sequence, seq + 1, ATOMIC_ORDER_RELAXED );
111 _Atomic_Fence( ATOMIC_ORDER_ACQ_REL );
122static inline void _SMP_sequence_lock_Write_end(
123 SMP_sequence_lock_Control *lock,
127 _Atomic_Store_uint( &lock->sequence, seq + 2, ATOMIC_ORDER_RELEASE );
139static inline unsigned int _SMP_sequence_lock_Read_begin(
140 const SMP_sequence_lock_Control *lock
143 return _Atomic_Load_uint( &lock->sequence, ATOMIC_ORDER_ACQUIRE );
157static inline bool _SMP_sequence_lock_Read_retry(
158 SMP_sequence_lock_Control *lock,
164 seq2 = _Atomic_Fetch_add_uint( &lock->sequence, 0, ATOMIC_ORDER_RELEASE );
165 return seq != seq2 || seq % 2 != 0;
Information for the Assert Handler.
#define _Assert(_e)
Assertion similar to assert() controlled via RTEMS_DEBUG instead of NDEBUG.
Definition: assert.h:100