From b5a21bf139168285a009c8da65e63ea99bc064ba Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 20 Apr 2016 06:15:07 +0200 Subject: posix: Avoid Giant lock in sem_getvalue() Update #2555. --- cpukit/posix/src/semgetvalue.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/cpukit/posix/src/semgetvalue.c b/cpukit/posix/src/semgetvalue.c index ed49c09d38..f89526610f 100644 --- a/cpukit/posix/src/semgetvalue.c +++ b/cpukit/posix/src/semgetvalue.c @@ -37,13 +37,22 @@ int sem_getvalue( { POSIX_Semaphore_Control *the_semaphore; Objects_Locations location; + ISR_lock_Context lock_context; - the_semaphore = _POSIX_Semaphore_Get( sem, &location ); + the_semaphore = _POSIX_Semaphore_Get_interrupt_disable( + sem, + &location, + &lock_context + ); switch ( location ) { case OBJECTS_LOCAL: + /* + * Assume a relaxed atomic load of the value on SMP configurations. + * Thus, there is no need to acquire a lock. + */ *sval = _CORE_semaphore_Get_count( &the_semaphore->Semaphore ); - _Objects_Put( &the_semaphore->Object ); + _ISR_lock_ISR_enable( &lock_context ); return 0; #if defined(RTEMS_MULTIPROCESSING) -- cgit v1.2.3