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 #ifdef HAVE_CONFIG_H
0038 #include "config.h"
0039 #endif
0040
0041 #include <rtems/posix/muteximpl.h>
0042 #include <rtems/posix/posixapi.h>
0043
0044 Status_Control _POSIX_Mutex_Seize_slow(
0045 POSIX_Mutex_Control *the_mutex,
0046 const Thread_queue_Operations *operations,
0047 Thread_Control *executing,
0048 const struct timespec *abstime,
0049 Thread_queue_Context *queue_context
0050 )
0051 {
0052 if ( (uintptr_t) abstime != POSIX_MUTEX_ABSTIME_TRY_LOCK ) {
0053 _Thread_queue_Context_set_thread_state(
0054 queue_context,
0055 STATES_WAITING_FOR_MUTEX
0056 );
0057 _Thread_queue_Context_set_deadlock_callout(
0058 queue_context,
0059 _Thread_queue_Deadlock_status
0060 );
0061 _Thread_queue_Enqueue(
0062 &the_mutex->Recursive.Mutex.Queue.Queue,
0063 operations,
0064 executing,
0065 queue_context
0066 );
0067 return _Thread_Wait_get_status( executing );
0068 } else {
0069 _POSIX_Mutex_Release( the_mutex, queue_context );
0070 return STATUS_UNAVAILABLE;
0071 }
0072 }
0073
0074 int _POSIX_Mutex_Lock_support(
0075 pthread_mutex_t *mutex,
0076 const struct timespec *abstime,
0077 Thread_queue_Enqueue_callout enqueue_callout
0078 )
0079 {
0080 POSIX_Mutex_Control *the_mutex;
0081 unsigned long flags;
0082 Thread_queue_Context queue_context;
0083 Thread_Control *executing;
0084 Status_Control status;
0085
0086 the_mutex = _POSIX_Mutex_Get( mutex );
0087 POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags );
0088
0089 executing = _POSIX_Mutex_Acquire( the_mutex, &queue_context );
0090 _Thread_queue_Context_set_enqueue_callout( &queue_context, enqueue_callout);
0091 _Thread_queue_Context_set_timeout_argument( &queue_context, abstime, true );
0092
0093 switch ( _POSIX_Mutex_Get_protocol( flags ) ) {
0094 case POSIX_MUTEX_PRIORITY_CEILING:
0095 status = _POSIX_Mutex_Ceiling_seize(
0096 the_mutex,
0097 flags,
0098 executing,
0099 abstime,
0100 &queue_context
0101 );
0102 break;
0103 case POSIX_MUTEX_NO_PROTOCOL:
0104 status = _POSIX_Mutex_Seize(
0105 the_mutex,
0106 flags,
0107 POSIX_MUTEX_NO_PROTOCOL_TQ_OPERATIONS,
0108 executing,
0109 abstime,
0110 &queue_context
0111 );
0112 break;
0113 default:
0114 _Assert(
0115 _POSIX_Mutex_Get_protocol( flags ) == POSIX_MUTEX_PRIORITY_INHERIT
0116 );
0117 status = _POSIX_Mutex_Seize(
0118 the_mutex,
0119 flags,
0120 POSIX_MUTEX_PRIORITY_INHERIT_TQ_OPERATIONS,
0121 executing,
0122 abstime,
0123 &queue_context
0124 );
0125 break;
0126 }
0127
0128 return _POSIX_Get_error( status );
0129 }