diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-04-21 06:32:16 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-04-22 09:25:09 +0200 |
commit | 84a539885335c629100a6a12b57ead54bbbc0165 (patch) | |
tree | ff8d0acd9624e3888dc7fc6df9003a98a19b9b3d /cpukit/posix/src/prwlockrdlock.c | |
parent | score: Avoid Giant lock for barriers (diff) | |
download | rtems-84a539885335c629100a6a12b57ead54bbbc0165.tar.bz2 |
score: Avoid Giant lock for CORE rwlock
Update #2555.
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 + ); } |