diff options
Diffstat (limited to 'cpukit/posix/src/mutexlocksupp.c')
-rw-r--r-- | cpukit/posix/src/mutexlocksupp.c | 59 |
1 files changed, 50 insertions, 9 deletions
diff --git a/cpukit/posix/src/mutexlocksupp.c b/cpukit/posix/src/mutexlocksupp.c index 6ecf87cb46..2499ae1ace 100644 --- a/cpukit/posix/src/mutexlocksupp.c +++ b/cpukit/posix/src/mutexlocksupp.c @@ -21,16 +21,39 @@ #include <rtems/posix/muteximpl.h> #include <rtems/posix/posixapi.h> -THREAD_QUEUE_OBJECT_ASSERT( POSIX_Mutex_Control, Mutex.Wait_queue ); +THREAD_QUEUE_OBJECT_ASSERT( + POSIX_Mutex_Control, + Mutex.Recursive.Mutex.Wait_queue +); + +static Status_Control _POSIX_Mutex_Lock_nested( + CORE_recursive_mutex_Control *the_recursive_mutex +) +{ + POSIX_Mutex_Control *the_mutex; + + the_mutex = RTEMS_CONTAINER_OF( + the_recursive_mutex, + POSIX_Mutex_Control, + Mutex.Recursive + ); + + if ( the_mutex->is_recursive ) { + return _CORE_recursive_mutex_Seize_nested( the_recursive_mutex ); + } else { + return STATUS_NESTING_NOT_ALLOWED; + } +} int _POSIX_Mutex_Lock_support( pthread_mutex_t *mutex, - bool blocking, + bool wait, Watchdog_Interval timeout ) { POSIX_Mutex_Control *the_mutex; Thread_queue_Context queue_context; + Thread_Control *executing; Status_Control status; the_mutex = _POSIX_Mutex_Get( mutex, &queue_context ); @@ -39,12 +62,30 @@ int _POSIX_Mutex_Lock_support( return EINVAL; } - status = _CORE_mutex_Seize( - &the_mutex->Mutex, - _Thread_Executing, - blocking, - timeout, - &queue_context - ); + executing = _Thread_Executing; + + switch ( the_mutex->protocol ) { + case POSIX_MUTEX_NO_PROTOCOL: + status = _CORE_recursive_mutex_Seize_no_protocol( + &the_mutex->Mutex.Recursive, + POSIX_MUTEX_NO_PROTOCOL_TQ_OPERATIONS, + executing, + wait, + timeout, + _POSIX_Mutex_Lock_nested, + &queue_context + ); + break; + default: + status = _CORE_mutex_Seize( + &the_mutex->Mutex.Recursive.Mutex, + executing, + wait, + timeout, + &queue_context + ); + break; + } + return _POSIX_Get_error( status ); } |