File indexing completed on 2025-05-11 08:24:21
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
0041 #ifdef HAVE_CONFIG_H
0042 #include "config.h"
0043 #endif
0044
0045 #include <rtems/posix/barrierimpl.h>
0046 #include <rtems/posix/posixapi.h>
0047
0048 RTEMS_STATIC_ASSERT(
0049 offsetof( POSIX_Barrier_Control, flags )
0050 == offsetof( pthread_barrier_t, _flags ),
0051 POSIX_BARRIER_CONTROL_FLAGS
0052 );
0053
0054 RTEMS_STATIC_ASSERT(
0055 offsetof( POSIX_Barrier_Control, count )
0056 == offsetof( pthread_barrier_t, _count ),
0057 POSIX_BARRIER_CONTROL_COUNT
0058 );
0059
0060 RTEMS_STATIC_ASSERT(
0061 offsetof( POSIX_Barrier_Control, waiting_threads )
0062 == offsetof( pthread_barrier_t, _waiting_threads ),
0063 POSIX_BARRIER_CONTROL_WAITING_THREADS
0064 );
0065
0066 RTEMS_STATIC_ASSERT(
0067 offsetof( POSIX_Barrier_Control, Queue )
0068 == offsetof( pthread_barrier_t, _Queue ),
0069 POSIX_BARRIER_CONTROL_QUEUE
0070 );
0071
0072 RTEMS_STATIC_ASSERT(
0073 sizeof( POSIX_Barrier_Control ) == sizeof( pthread_barrier_t ),
0074 POSIX_BARRIER_CONTROL_SIZE
0075 );
0076
0077 int pthread_barrier_init(
0078 pthread_barrier_t *_barrier,
0079 const pthread_barrierattr_t *attr,
0080 unsigned int count
0081 )
0082 {
0083 POSIX_Barrier_Control *barrier;
0084
0085 barrier = _POSIX_Barrier_Get( _barrier );
0086
0087
0088
0089
0090 if ( barrier == NULL ) {
0091 return EINVAL;
0092 }
0093
0094 if ( count == 0 ) {
0095 return EINVAL;
0096 }
0097
0098 if ( attr != NULL ) {
0099
0100
0101
0102 if ( !attr->is_initialized )
0103 return EINVAL;
0104
0105 if ( !_POSIX_Is_valid_pshared( attr->process_shared ) ) {
0106 return EINVAL;
0107 }
0108 }
0109
0110 barrier->flags = (uintptr_t) barrier ^ POSIX_BARRIER_MAGIC;
0111 barrier->count = count;
0112 barrier->waiting_threads = 0;
0113 _Thread_queue_Queue_initialize( &barrier->Queue.Queue, NULL );
0114 return 0;
0115 }