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 bool _POSIX_Mutex_Auto_initialization( POSIX_Mutex_Control *the_mutex )
0045 {
0046 unsigned long zero;
0047 unsigned long flags;
0048
0049
0050 zero = 0;
0051 zero |= the_mutex->flags;
0052 #if defined(RTEMS_SMP)
0053 zero |= _Atomic_Load_uint(
0054 &the_mutex->Recursive.Mutex.Queue.Queue.Lock.next_ticket,
0055 ATOMIC_ORDER_RELAXED
0056 );
0057 zero |= _Atomic_Load_uint(
0058 &the_mutex->Recursive.Mutex.Queue.Queue.Lock.now_serving,
0059 ATOMIC_ORDER_RELAXED
0060 );
0061 #else
0062 zero |= the_mutex->Recursive.Mutex.Queue.reserved[ 0 ];
0063 zero |= the_mutex->Recursive.Mutex.Queue.reserved[ 1 ];
0064 #endif
0065 zero |= (unsigned long) the_mutex->Recursive.Mutex.Queue.Queue.heads;
0066 zero |= (unsigned long) the_mutex->Recursive.Mutex.Queue.Queue.owner;
0067 zero |= (unsigned long) the_mutex->Recursive.Mutex.Queue.Queue.name;
0068 zero |= the_mutex->Recursive.nest_level;
0069 zero |= (unsigned long) the_mutex->Priority_ceiling.Node.RBTree.Node.rbe_left;
0070 zero |= (unsigned long) the_mutex->Priority_ceiling.Node.RBTree.Node.rbe_right;
0071 zero |= (unsigned long) the_mutex->Priority_ceiling.Node.RBTree.Node.rbe_parent;
0072 zero |= (unsigned long) the_mutex->Priority_ceiling.Node.RBTree.Node.rbe_color;
0073 zero |= (unsigned long) the_mutex->Priority_ceiling.priority;
0074 zero |= (unsigned long) (the_mutex->Priority_ceiling.priority >> 32);
0075 zero |= (unsigned long) the_mutex->scheduler;
0076
0077 if ( zero != 0 ) {
0078 return false;
0079 }
0080
0081 flags = (uintptr_t) the_mutex ^ POSIX_MUTEX_MAGIC;
0082 flags &= ~POSIX_MUTEX_FLAGS_MASK;
0083 the_mutex->flags = flags;
0084 return true;
0085 }
0086
0087
0088
0089
0090
0091
0092
0093 int pthread_mutex_unlock(
0094 pthread_mutex_t *mutex
0095 )
0096 {
0097 POSIX_Mutex_Control *the_mutex;
0098 unsigned long flags;
0099 Thread_queue_Context queue_context;
0100 Thread_Control *executing;
0101 Status_Control status;
0102
0103 the_mutex = _POSIX_Mutex_Get( mutex );
0104 POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags );
0105
0106 executing = _POSIX_Mutex_Acquire( the_mutex, &queue_context );
0107
0108 switch ( _POSIX_Mutex_Get_protocol( flags ) ) {
0109 case POSIX_MUTEX_PRIORITY_CEILING:
0110 status = _POSIX_Mutex_Ceiling_surrender(
0111 the_mutex,
0112 executing,
0113 &queue_context
0114 );
0115 break;
0116 case POSIX_MUTEX_NO_PROTOCOL:
0117 status = _POSIX_Mutex_Surrender(
0118 the_mutex,
0119 POSIX_MUTEX_NO_PROTOCOL_TQ_OPERATIONS,
0120 executing,
0121 &queue_context
0122 );
0123 break;
0124 default:
0125 _Assert(
0126 _POSIX_Mutex_Get_protocol( flags ) == POSIX_MUTEX_PRIORITY_INHERIT
0127 );
0128 status = _POSIX_Mutex_Surrender(
0129 the_mutex,
0130 POSIX_MUTEX_PRIORITY_INHERIT_TQ_OPERATIONS,
0131 executing,
0132 &queue_context
0133 );
0134 break;
0135 }
0136
0137 return _POSIX_Get_error( status );
0138 }