[PATCH 01/10] posix: Avoid Giant lock in sem_getvalue()

Sebastian Huber sebastian.huber at embedded-brains.de
Thu Apr 21 07:20:05 UTC 2016


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 ed49c09..f895266 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)
-- 
1.8.4.5



More information about the devel mailing list