From 9052f88b1647c7ba77e2159b0012e014ab165b2b Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 11 May 2015 10:14:31 +0200 Subject: 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(-) create mode 100644 cpukit/score/src/smplock.c diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am index cede673bb6..714bd6663b 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 5eb6ef344f..50a0662ca9 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 #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 0000000000..14400917ef --- /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 + * + * + * 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 + +#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) */ -- cgit v1.2.3