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 #ifdef HAVE_CONFIG_H
0040 #include "config.h"
0041 #endif
0042
0043 #include <rtems/posix/rwlockimpl.h>
0044 #include <rtems/posix/posixapi.h>
0045
0046 RTEMS_STATIC_ASSERT(
0047 offsetof( POSIX_RWLock_Control, flags )
0048 == offsetof( pthread_rwlock_t, _flags ),
0049 POSIX_RWLOCK_CONTROL_FLAGS
0050 );
0051
0052 RTEMS_STATIC_ASSERT(
0053 offsetof( POSIX_RWLock_Control, RWLock.current_state )
0054 == offsetof( pthread_rwlock_t, _current_state ),
0055 POSIX_RWLOCK_CONTROL_CURRENT_STATE
0056 );
0057
0058 RTEMS_STATIC_ASSERT(
0059 offsetof( POSIX_RWLock_Control, RWLock.number_of_readers )
0060 == offsetof( pthread_rwlock_t, _number_of_readers ),
0061 POSIX_RWLOCK_CONTROL_NUMBER_OF_READERS
0062 );
0063
0064 RTEMS_STATIC_ASSERT(
0065 offsetof( POSIX_RWLock_Control, RWLock.Queue )
0066 == offsetof( pthread_rwlock_t, _Queue ),
0067 POSIX_RWLOCK_CONTROL_QUEUE
0068 );
0069
0070 RTEMS_STATIC_ASSERT(
0071 sizeof( POSIX_RWLock_Control ) == sizeof( pthread_rwlock_t ),
0072 POSIX_RWLOCK_CONTROL_SIZE
0073 );
0074
0075 int pthread_rwlock_init(
0076 pthread_rwlock_t *rwlock,
0077 const pthread_rwlockattr_t *attr
0078 )
0079 {
0080 POSIX_RWLock_Control *the_rwlock;
0081
0082 the_rwlock = _POSIX_RWLock_Get( rwlock );
0083
0084 if ( the_rwlock == NULL ) {
0085 return EINVAL;
0086 }
0087
0088 if ( attr != NULL ) {
0089 if ( !attr->is_initialized ) {
0090 return EINVAL;
0091 }
0092
0093 if ( !_POSIX_Is_valid_pshared( attr->process_shared ) ) {
0094 return EINVAL;
0095 }
0096 }
0097
0098 the_rwlock->flags = (uintptr_t) the_rwlock ^ POSIX_RWLOCK_MAGIC;
0099 _CORE_RWLock_Initialize( &the_rwlock->RWLock );
0100 return 0;
0101 }