From 84a539885335c629100a6a12b57ead54bbbc0165 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 21 Apr 2016 06:32:16 +0200 Subject: score: Avoid Giant lock for CORE rwlock Update #2555. --- cpukit/posix/src/prwlockrdlock.c | 56 ++++++++++++---------------------------- 1 file changed, 17 insertions(+), 39 deletions(-) (limited to 'cpukit/posix/src/prwlockrdlock.c') 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 -#include - #include -#include - -/** - * 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 + ); } -- cgit v1.2.3