File indexing completed on 2025-05-11 08:24:26
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 #ifdef HAVE_CONFIG_H
0039 #include "config.h"
0040 #endif
0041
0042 #include <rtems/score/corerwlockimpl.h>
0043 #include <rtems/score/assert.h>
0044
0045 static bool _CORE_RWLock_Is_waiting_for_reading(
0046 const Thread_Control *the_thread
0047 )
0048 {
0049 if ( the_thread->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_READ ) {
0050 return true;
0051 } else {
0052 _Assert( the_thread->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE );
0053 return false;
0054 }
0055 }
0056
0057 static Thread_Control *_CORE_RWLock_Flush_filter(
0058 Thread_Control *the_thread,
0059 Thread_queue_Queue *queue,
0060 Thread_queue_Context *queue_context
0061 )
0062 {
0063 CORE_RWLock_Control *the_rwlock;
0064
0065 the_rwlock = RTEMS_CONTAINER_OF(
0066 queue,
0067 CORE_RWLock_Control,
0068 Queue.Queue
0069 );
0070
0071 switch ( the_rwlock->current_state ) {
0072 case CORE_RWLOCK_LOCKED_FOR_READING:
0073 if ( _CORE_RWLock_Is_waiting_for_reading( the_thread ) ) {
0074 the_rwlock->number_of_readers += 1;
0075 } else {
0076 the_thread = NULL;
0077 }
0078 break;
0079 case CORE_RWLOCK_LOCKED_FOR_WRITING:
0080 the_thread = NULL;
0081 break;
0082 default:
0083 _Assert( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED );
0084 if ( _CORE_RWLock_Is_waiting_for_reading( the_thread ) ) {
0085 the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING;
0086 the_rwlock->number_of_readers = 1;
0087 } else {
0088 the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING;
0089 }
0090 break;
0091 }
0092
0093 return the_thread;
0094 }
0095
0096 Status_Control _CORE_RWLock_Surrender( CORE_RWLock_Control *the_rwlock )
0097 {
0098 Thread_queue_Context queue_context;
0099
0100
0101
0102
0103
0104
0105
0106
0107 _Thread_queue_Context_initialize( &queue_context );
0108 _CORE_RWLock_Acquire( the_rwlock, &queue_context );
0109
0110 if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){
0111
0112 _CORE_RWLock_Release( the_rwlock, &queue_context );
0113 return STATUS_SUCCESSFUL;
0114 }
0115
0116 if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) {
0117 the_rwlock->number_of_readers -= 1;
0118
0119 if ( the_rwlock->number_of_readers != 0 ) {
0120
0121 _CORE_RWLock_Release( the_rwlock, &queue_context );
0122 return STATUS_SUCCESSFUL;
0123 }
0124 }
0125
0126 _Assert(
0127 the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_WRITING
0128 || ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING
0129 && the_rwlock->number_of_readers == 0 )
0130 );
0131
0132
0133
0134
0135
0136 the_rwlock->current_state = CORE_RWLOCK_UNLOCKED;
0137
0138 _Thread_queue_Flush_critical(
0139 &the_rwlock->Queue.Queue,
0140 CORE_RWLOCK_TQ_OPERATIONS,
0141 _CORE_RWLock_Flush_filter,
0142 &queue_context
0143 );
0144 return STATUS_SUCCESSFUL;
0145 }