File indexing completed on 2025-05-11 08:24:12
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040 #ifndef _RTEMS_POSIX_BARRIERIMPL_H
0041 #define _RTEMS_POSIX_BARRIERIMPL_H
0042
0043 #include <errno.h>
0044 #include <pthread.h>
0045
0046 #include <rtems/score/percpu.h>
0047 #include <rtems/score/threadqimpl.h>
0048
0049 #ifdef __cplusplus
0050 extern "C" {
0051 #endif
0052
0053 #define POSIX_BARRIER_MAGIC 0x1cf03773UL
0054
0055 #define POSIX_BARRIER_TQ_OPERATIONS &_Thread_queue_Operations_FIFO
0056
0057 typedef struct {
0058 unsigned long flags;
0059 Thread_queue_Syslock_queue Queue;
0060 unsigned int count;
0061 unsigned int waiting_threads;
0062 } POSIX_Barrier_Control;
0063
0064 static inline POSIX_Barrier_Control *_POSIX_Barrier_Get(
0065 pthread_barrier_t *_barrier
0066 )
0067 {
0068 return (POSIX_Barrier_Control *) _barrier;
0069 }
0070
0071 static inline Thread_Control *_POSIX_Barrier_Queue_acquire(
0072 POSIX_Barrier_Control *barrier,
0073 Thread_queue_Context *queue_context
0074 )
0075 {
0076 ISR_Level level;
0077 Thread_Control *executing;
0078
0079 _Thread_queue_Context_initialize( queue_context );
0080 _Thread_queue_Context_ISR_disable( queue_context, level );
0081 _Thread_queue_Context_set_ISR_level( queue_context, level );
0082 executing = _Thread_Executing;
0083 _Thread_queue_Queue_acquire_critical(
0084 &barrier->Queue.Queue,
0085 &executing->Potpourri_stats,
0086 &queue_context->Lock_context.Lock_context
0087 );
0088
0089 return executing;
0090 }
0091
0092 static inline void _POSIX_Barrier_Queue_release(
0093 POSIX_Barrier_Control *barrier,
0094 Thread_queue_Context *queue_context
0095 )
0096 {
0097 _Thread_queue_Queue_release(
0098 &barrier->Queue.Queue,
0099 &queue_context->Lock_context.Lock_context
0100 );
0101 }
0102
0103 #define POSIX_BARRIER_VALIDATE_OBJECT( bar ) \
0104 do { \
0105 if ( \
0106 ( bar ) == NULL \
0107 || ( (uintptr_t) ( bar ) ^ POSIX_BARRIER_MAGIC ) != ( bar )->_flags \
0108 ) { \
0109 return EINVAL; \
0110 } \
0111 } while ( 0 )
0112
0113 #ifdef __cplusplus
0114 }
0115 #endif
0116
0117 #endif
0118