[rtems commit] score: Do not inline SMP lock if profiling enabled

Sebastian Huber sebh at rtems.org
Wed May 20 07:12:03 UTC 2015


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

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Mon May 11 10:14:31 2015 +0200

score: Do not inline SMP lock if profiling enabled

This reduces the code size drastically.

---

 cpukit/score/Makefile.am                   |  1 +
 cpukit/score/include/rtems/score/smplock.h | 57 ++++++++++++++++++++++++-
 cpukit/score/src/smplock.c                 | 68 ++++++++++++++++++++++++++++++
 3 files changed, 125 insertions(+), 1 deletion(-)

diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am
index cede673..714bd66 100644
--- a/cpukit/score/Makefile.am
+++ b/cpukit/score/Makefile.am
@@ -138,6 +138,7 @@ libscore_a_SOURCES += src/schedulerprioritysmp.c
 libscore_a_SOURCES += src/schedulersimplesmp.c
 libscore_a_SOURCES += src/schedulersmpdebug.c
 libscore_a_SOURCES += src/smp.c
+libscore_a_SOURCES += src/smplock.c
 libscore_a_SOURCES += src/smpmulticastaction.c
 libscore_a_SOURCES += src/cpuset.c
 libscore_a_SOURCES += src/cpusetprintsupport.c
diff --git a/cpukit/score/include/rtems/score/smplock.h b/cpukit/score/include/rtems/score/smplock.h
index 5eb6ef3..50a0662 100644
--- a/cpukit/score/include/rtems/score/smplock.h
+++ b/cpukit/score/include/rtems/score/smplock.h
@@ -10,7 +10,7 @@
  * COPYRIGHT (c) 1989-2011.
  * On-Line Applications Research Corporation (OAR).
  *
- * Copyright (c) 2013-2014 embedded brains GmbH
+ * Copyright (c) 2013-2015 embedded brains GmbH
  *
  * The license and distribution terms for this file may be
  * found in the file LICENSE in this distribution or at
@@ -32,6 +32,10 @@
 #include <string.h>
 #endif
 
+#if defined( RTEMS_PROFILING )
+#define RTEMS_SMP_LOCK_DO_NOT_INLINE
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif /* __cplusplus */
@@ -368,7 +372,16 @@ typedef struct {
  * @param[in] name The name for the SMP lock statistics.  This name must be
  * persistent throughout the life time of this statistics block.
  */
+#if defined( RTEMS_SMP_LOCK_DO_NOT_INLINE )
+void _SMP_lock_Initialize(
+  SMP_lock_Control *lock,
+  const char *name
+);
+
+static inline void _SMP_lock_Initialize_body(
+#else
 static inline void _SMP_lock_Initialize(
+#endif
   SMP_lock_Control *lock,
   const char *name
 )
@@ -383,7 +396,13 @@ static inline void _SMP_lock_Initialize(
  *
  * @param[in,out] lock The SMP lock control.
  */
+#if defined( RTEMS_SMP_LOCK_DO_NOT_INLINE )
+void _SMP_lock_Destroy( SMP_lock_Control *lock );
+
+static inline void _SMP_lock_Destroy_body( SMP_lock_Control *lock )
+#else
 static inline void _SMP_lock_Destroy( SMP_lock_Control *lock )
+#endif
 {
   _SMP_ticket_lock_Destroy( &lock->ticket_lock );
 }
@@ -399,7 +418,16 @@ static inline void _SMP_lock_Destroy( SMP_lock_Control *lock )
  * @param[in,out] context The local SMP lock context for an acquire and release
  * pair.
  */
+#if defined( RTEMS_SMP_LOCK_DO_NOT_INLINE )
+void _SMP_lock_Acquire(
+  SMP_lock_Control *lock,
+  SMP_lock_Context *context
+);
+
+static inline void _SMP_lock_Acquire_body(
+#else
 static inline void _SMP_lock_Acquire(
+#endif
   SMP_lock_Control *lock,
   SMP_lock_Context *context
 )
@@ -415,7 +443,16 @@ static inline void _SMP_lock_Acquire(
  * @param[in,out] context The local SMP lock context for an acquire and release
  * pair.
  */
+#if defined( RTEMS_SMP_LOCK_DO_NOT_INLINE )
+void _SMP_lock_Release(
+  SMP_lock_Control *lock,
+  SMP_lock_Context *context
+);
+
+static inline void _SMP_lock_Release_body(
+#else
 static inline void _SMP_lock_Release(
+#endif
   SMP_lock_Control *lock,
   SMP_lock_Context *context
 )
@@ -431,7 +468,16 @@ static inline void _SMP_lock_Release(
  * @param[in,out] context The local SMP lock context for an acquire and release
  * pair.
  */
+#if defined( RTEMS_SMP_LOCK_DO_NOT_INLINE )
+void _SMP_lock_ISR_disable_and_acquire(
+  SMP_lock_Control *lock,
+  SMP_lock_Context *context
+);
+
+static inline void _SMP_lock_ISR_disable_and_acquire_body(
+#else
 static inline void _SMP_lock_ISR_disable_and_acquire(
+#endif
   SMP_lock_Control *lock,
   SMP_lock_Context *context
 )
@@ -447,7 +493,16 @@ static inline void _SMP_lock_ISR_disable_and_acquire(
  * @param[in,out] context The local SMP lock context for an acquire and release
  * pair.
  */
+#if defined( RTEMS_SMP_LOCK_DO_NOT_INLINE )
+void _SMP_lock_Release_and_ISR_enable(
+  SMP_lock_Control *lock,
+  SMP_lock_Context *context
+);
+
+static inline void _SMP_lock_Release_and_ISR_enable_body(
+#else
 static inline void _SMP_lock_Release_and_ISR_enable(
+#endif
   SMP_lock_Control *lock,
   SMP_lock_Context *context
 )
diff --git a/cpukit/score/src/smplock.c b/cpukit/score/src/smplock.c
new file mode 100644
index 0000000..1440091
--- /dev/null
+++ b/cpukit/score/src/smplock.c
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2015 embedded brains GmbH.  All rights reserved.
+ *
+ *  embedded brains GmbH
+ *  Dornierstr. 4
+ *  82178 Puchheim
+ *  Germany
+ *  <rtems at embedded-brains.de>
+ *
+ * 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/smplock.h>
+
+#if defined(RTEMS_SMP_LOCK_DO_NOT_INLINE)
+
+void _SMP_lock_Initialize(
+  SMP_lock_Control *lock,
+  const char *name
+)
+{
+  _SMP_lock_Initialize_body( lock, name );
+}
+
+void _SMP_lock_Destroy( SMP_lock_Control *lock )
+{
+  _SMP_lock_Destroy_body( lock );
+}
+
+void _SMP_lock_Acquire(
+  SMP_lock_Control *lock,
+  SMP_lock_Context *context
+)
+{
+  _SMP_lock_Acquire_body( lock, context );
+}
+
+void _SMP_lock_Release(
+  SMP_lock_Control *lock,
+  SMP_lock_Context *context
+)
+{
+  _SMP_lock_Release_body( lock, context );
+}
+
+void _SMP_lock_ISR_disable_and_acquire(
+  SMP_lock_Control *lock,
+  SMP_lock_Context *context
+)
+{
+  _SMP_lock_ISR_disable_and_acquire_body( lock, context );
+}
+
+void _SMP_lock_Release_and_ISR_enable(
+  SMP_lock_Control *lock,
+  SMP_lock_Context *context
+)
+{
+  _SMP_lock_Release_and_ISR_enable_body( lock, context );
+}
+
+#endif /* defined(RTEMS_SMP_LOCK_DO_NOT_INLINE) */



More information about the vc mailing list