diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-27 10:17:28 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-30 16:16:22 +0200 |
commit | e0bb60bc81cc89988005261fcdfbc7f6f451e0c9 (patch) | |
tree | 65d9a2e6dede765911b8b6ea1b37befb1a80dbf8 | |
parent | rtems: Remove superfluous includes (diff) | |
download | rtems-e0bb60bc81cc89988005261fcdfbc7f6f451e0c9.tar.bz2 |
posix: Avoid use of internal mutex methods
Avoid use of internal mutex methods for condition variables.
-rw-r--r-- | cpukit/posix/src/condwaitsupp.c | 36 |
1 files changed, 13 insertions, 23 deletions
diff --git a/cpukit/posix/src/condwaitsupp.c b/cpukit/posix/src/condwaitsupp.c index 7dff27f161..ebcb3c4baf 100644 --- a/cpukit/posix/src/condwaitsupp.c +++ b/cpukit/posix/src/condwaitsupp.c @@ -19,7 +19,6 @@ #endif #include <rtems/posix/condimpl.h> -#include <rtems/posix/muteximpl.h> #include <rtems/posix/posixapi.h> #include <rtems/score/assert.h> #include <rtems/score/statesimpl.h> @@ -36,11 +35,9 @@ int _POSIX_Condition_variables_Wait_support( ) { POSIX_Condition_variables_Control *the_cond; - POSIX_Mutex_Control *the_mutex; Thread_queue_Context queue_context; int error; int mutex_error; - Status_Control status; Per_CPU_Control *cpu_self; Thread_Control *executing; @@ -69,22 +66,6 @@ int _POSIX_Condition_variables_Wait_support( cpu_self = _Thread_Dispatch_disable_critical( &queue_context.Lock_context ); executing = _Per_CPU_Get_executing( cpu_self ); - /* - * Historically, we ignored the unlock status since the behavior - * is undefined by POSIX. But GNU/Linux returns EPERM in this - * case, so we follow their lead. - */ - - the_mutex = _POSIX_Mutex_Get_no_protection( mutex ); - if ( - the_mutex == NULL - || !_CORE_mutex_Is_owner( &the_mutex->Mutex, executing ) - ) { - _POSIX_Condition_variables_Release( the_cond, &queue_context ); - _Thread_Dispatch_enable( cpu_self ); - return EPERM; - } - if ( !already_timedout ) { _Thread_queue_Context_set_expected_level( &queue_context, 2 ); _Thread_queue_Enqueue_critical( @@ -100,10 +81,18 @@ int _POSIX_Condition_variables_Wait_support( executing->Wait.return_code = STATUS_TIMEOUT; } - _ISR_lock_ISR_disable( &queue_context.Lock_context ); - status = _CORE_mutex_Surrender( &the_mutex->Mutex, &queue_context ); - _Assert( status == STATUS_SUCCESSFUL ); - (void) status; + mutex_error = pthread_mutex_unlock( mutex ); + if ( mutex_error != 0 ) { + /* + * Historically, we ignored the unlock status since the behavior + * is undefined by POSIX. But GNU/Linux returns EPERM in this + * case, so we follow their lead. + */ + _Assert( mutex_error == EINVAL || mutex_error == EPERM ); + _Thread_queue_Extract( executing ); + _Thread_Dispatch_enable( cpu_self ); + return EPERM; + } /* * Switch ourself out because we blocked as a result of the @@ -132,6 +121,7 @@ int _POSIX_Condition_variables_Wait_support( mutex_error = pthread_mutex_lock( mutex ); if ( mutex_error != 0 ) { + _Assert( mutex_error == EINVAL ); return EINVAL; } |