[PATCH 28/45] score: Inline _CORE_semaphore_Surrender()

Sebastian Huber sebastian.huber at embedded-brains.de
Fri May 15 11:41:28 UTC 2015


---
 cpukit/score/Makefile.am                       |  3 +-
 cpukit/score/include/rtems/score/coresemimpl.h | 41 +++++++++++++++-
 cpukit/score/src/coresemsurrender.c            | 66 --------------------------
 3 files changed, 40 insertions(+), 70 deletions(-)
 delete mode 100644 cpukit/score/src/coresemsurrender.c

diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am
index 58673bb..cede673 100644
--- a/cpukit/score/Makefile.am
+++ b/cpukit/score/Makefile.am
@@ -177,8 +177,7 @@ libscore_a_SOURCES += src/corerwlock.c src/corerwlockobtainread.c \
 endif
 
 ## CORE_SEMAPHORE_C_FILES
-libscore_a_SOURCES += src/coresem.c \
-    src/coresemsurrender.c
+libscore_a_SOURCES += src/coresem.c
 
 ## CORE_SPINLOCK_C_FILES
 if HAS_PTHREADS
diff --git a/cpukit/score/include/rtems/score/coresemimpl.h b/cpukit/score/include/rtems/score/coresemimpl.h
index f1ac9c6..d231e23 100644
--- a/cpukit/score/include/rtems/score/coresemimpl.h
+++ b/cpukit/score/include/rtems/score/coresemimpl.h
@@ -118,12 +118,49 @@ RTEMS_INLINE_ROUTINE void _CORE_semaphore_Destroy(
  *
  *  @retval an indication of whether the routine succeeded or failed
  */
-CORE_semaphore_Status _CORE_semaphore_Surrender(
+RTEMS_INLINE_ROUTINE CORE_semaphore_Status _CORE_semaphore_Surrender(
   CORE_semaphore_Control                *the_semaphore,
   Objects_Id                             id,
   CORE_semaphore_API_mp_support_callout  api_semaphore_mp_support,
   ISR_lock_Context                      *lock_context
-);
+)
+{
+  Thread_Control *the_thread;
+  CORE_semaphore_Status status;
+
+  status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
+
+  _Thread_queue_Acquire_critical( &the_semaphore->Wait_queue, lock_context );
+
+  the_thread = _Thread_queue_First_locked( &the_semaphore->Wait_queue );
+  if ( the_thread != NULL ) {
+#if defined(RTEMS_MULTIPROCESSING)
+    _Thread_Dispatch_disable_critical();
+#endif
+
+    _Thread_queue_Extract_critical(
+      &the_semaphore->Wait_queue,
+      the_thread,
+      lock_context
+    );
+
+#if defined(RTEMS_MULTIPROCESSING)
+    if ( !_Objects_Is_local_id( the_thread->Object.id ) )
+      (*api_semaphore_mp_support) ( the_thread, id );
+
+    _Thread_Dispatch_enable( _Per_CPU_Get() );
+#endif
+  } else {
+    if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
+      the_semaphore->count += 1;
+    else
+      status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
+
+    _Thread_queue_Release( &the_semaphore->Wait_queue, lock_context );
+  }
+
+  return status;
+}
 
 /**
  *  @brief Core semaphore flush.
diff --git a/cpukit/score/src/coresemsurrender.c b/cpukit/score/src/coresemsurrender.c
deleted file mode 100644
index fbc088f..0000000
--- a/cpukit/score/src/coresemsurrender.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * @file
- *
- * @brief Surrenders a Unit to a Semaphore
- *
- * @ingroup ScoreSemaphore
- */
-
-/*
- *  COPYRIGHT (c) 1989-1999.
- *  On-Line Applications Research Corporation (OAR).
- *
- *  The license and distribution terms for this file may be
- *  found in the file LICENSE in this distribution or at
- *  http://www.rtems.org/license/LICENSE.
- */
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <rtems/score/coresemimpl.h>
-
-CORE_semaphore_Status _CORE_semaphore_Surrender(
-  CORE_semaphore_Control                *the_semaphore,
-  Objects_Id                             id,
-  CORE_semaphore_API_mp_support_callout  api_semaphore_mp_support,
-  ISR_lock_Context                      *lock_context
-)
-{
-  Thread_Control *the_thread;
-  CORE_semaphore_Status status;
-
-  status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
-
-  _Thread_queue_Acquire_critical( &the_semaphore->Wait_queue, lock_context );
-
-  the_thread = _Thread_queue_First_locked( &the_semaphore->Wait_queue );
-  if ( the_thread != NULL ) {
-#if defined(RTEMS_MULTIPROCESSING)
-    _Thread_Dispatch_disable_critical();
-#endif
-
-    _Thread_queue_Extract_critical(
-      &the_semaphore->Wait_queue,
-      the_thread,
-      lock_context
-    );
-
-#if defined(RTEMS_MULTIPROCESSING)
-    if ( !_Objects_Is_local_id( the_thread->Object.id ) )
-      (*api_semaphore_mp_support) ( the_thread, id );
-
-    _Thread_Dispatch_enable( _Per_CPU_Get() );
-#endif
-  } else {
-    if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
-      the_semaphore->count += 1;
-    else
-      status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
-
-    _Thread_queue_Release( &the_semaphore->Wait_queue, lock_context );
-  }
-
-  return status;
-}
-- 
1.8.4.5



More information about the devel mailing list