diff options
Diffstat (limited to 'cpukit/posix/src/prwlockrdlock.c')
-rw-r--r-- | cpukit/posix/src/prwlockrdlock.c | 56 |
1 files changed, 17 insertions, 39 deletions
diff --git a/cpukit/posix/src/prwlockrdlock.c b/cpukit/posix/src/prwlockrdlock.c index 7d1bcaa9f4..3459399c6b 100644 --- a/cpukit/posix/src/prwlockrdlock.c +++ b/cpukit/posix/src/prwlockrdlock.c @@ -18,53 +18,31 @@ #include "config.h" #endif -#include <pthread.h> -#include <errno.h> - #include <rtems/posix/rwlockimpl.h> -#include <rtems/score/thread.h> - -/** - * This directive attempts to obtain a read only lock on an rwlock instance. - * - * @param[in] rwlock is the pointer to rwlock id - * - * @retval 0 if successful - * @retval error_code if unsuccessful - */ int pthread_rwlock_rdlock( pthread_rwlock_t *rwlock ) { - POSIX_RWLock_Control *the_rwlock; - Objects_Locations location; - Thread_Control *executing; - - the_rwlock = _POSIX_RWLock_Get( rwlock, &location ); - switch ( location ) { - - case OBJECTS_LOCAL: + POSIX_RWLock_Control *the_rwlock; + ISR_lock_Context lock_context; + Thread_Control *executing; - executing = _Thread_Executing; - _CORE_RWLock_Seize_for_reading( - &the_rwlock->RWLock, - executing, - true, /* we are willing to wait forever */ - 0 - ); + the_rwlock = _POSIX_RWLock_Get( rwlock, &lock_context ); - _Objects_Put( &the_rwlock->Object ); - return _POSIX_RWLock_Translate_core_RWLock_return_code( - (CORE_RWLock_Status) executing->Wait.return_code - ); - -#if defined(RTEMS_MULTIPROCESSING) - case OBJECTS_REMOTE: -#endif - case OBJECTS_ERROR: - break; + if ( the_rwlock == NULL ) { + return EINVAL; } - return EINVAL; + executing = _Thread_Executing; + _CORE_RWLock_Seize_for_reading( + &the_rwlock->RWLock, + executing, + true, /* we are willing to wait forever */ + 0, + &lock_context + ); + return _POSIX_RWLock_Translate_core_RWLock_return_code( + (CORE_RWLock_Status) executing->Wait.return_code + ); } |