[rtems commit] posix: Avoid Giant lock in sem_getvalue()

Sebastian Huber sebh at rtems.org
Fri Apr 22 07:28:44 UTC 2016


Module:    rtems
Branch:    master
Commit:    b5a21bf139168285a009c8da65e63ea99bc064ba
Changeset: http://git.rtems.org/rtems/commit/?id=b5a21bf139168285a009c8da65e63ea99bc064ba

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Wed Apr 20 06:15:07 2016 +0200

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 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)



More information about the vc mailing list