[PATCH 2/6] score: Add _ISR_lock_Set_name()

Sebastian Huber sebastian.huber at embedded-brains.de
Thu Apr 11 13:45:36 UTC 2019


Add _ISR_lock_Set_name() to optimize the initialization of
zero-initialized locks.
---
 cpukit/include/rtems/score/isrlock.h | 15 +++++++++++++++
 cpukit/include/rtems/score/smplock.h | 21 ++++++++++++++++++++-
 cpukit/score/src/smp.c               |  2 +-
 testsuites/sptests/sp37/init.c       | 22 +++++++++++++++++-----
 4 files changed, 53 insertions(+), 7 deletions(-)

diff --git a/cpukit/include/rtems/score/isrlock.h b/cpukit/include/rtems/score/isrlock.h
index b1aea62bf0..de85286de7 100644
--- a/cpukit/include/rtems/score/isrlock.h
+++ b/cpukit/include/rtems/score/isrlock.h
@@ -199,6 +199,21 @@ RTEMS_INLINE_ROUTINE void _ISR_lock_Context_set_level(
   #define _ISR_lock_Destroy( _lock )
 #endif
 
+/**
+ * @brief Sets the name of an ISR lock.
+ *
+ * @param[out] _lock The ISR lock control.
+ * @param _name The name for the ISR lock.  This name must be a string
+ *   persistent throughout the life time of this lock.  The name is only used
+ *   if profiling is enabled.
+ */
+#if defined( RTEMS_SMP )
+  #define _ISR_lock_Set_name( _lock, _name ) \
+    _SMP_lock_Set_name( &( _lock )->Lock, _name )
+#else
+  #define _ISR_lock_Set_name( _lock, _name )
+#endif
+
 /**
  * @brief Acquires an ISR lock.
  *
diff --git a/cpukit/include/rtems/score/smplock.h b/cpukit/include/rtems/score/smplock.h
index 1c37db465b..b1f5a6de28 100644
--- a/cpukit/include/rtems/score/smplock.h
+++ b/cpukit/include/rtems/score/smplock.h
@@ -149,7 +149,7 @@ static inline void _SMP_lock_Initialize_inline(
 #if defined(RTEMS_SMP_LOCK_DO_NOT_INLINE)
 void _SMP_lock_Initialize(
   SMP_lock_Control *lock,
-  const char *      name
+  const char       *name
 );
 #else
 #define _SMP_lock_Initialize( lock, name ) \
@@ -176,6 +176,25 @@ void _SMP_lock_Destroy( SMP_lock_Control *lock );
   _SMP_lock_Destroy_inline( lock )
 #endif
 
+/**
+ * @brief Sets the name of an SMP lock.
+ *
+ * @param[out] lock The SMP lock control.
+ * @param name The name for the SMP lock statistics.  This name must be
+ *   persistent throughout the life time of this statistics block.
+ */
+static inline void _SMP_lock_Set_name(
+  SMP_lock_Control *lock,
+  const char       *name
+)
+{
+#if defined(RTEMS_PROFILING)
+  lock->Stats.name = name;
+#else
+  (void) name;
+#endif
+}
+
 #if defined(RTEMS_DEBUG)
 static inline uint32_t _SMP_lock_Who_am_I( void )
 {
diff --git a/cpukit/score/src/smp.c b/cpukit/score/src/smp.c
index 780b33c740..bfc23d5ce3 100644
--- a/cpukit/score/src/smp.c
+++ b/cpukit/score/src/smp.c
@@ -116,7 +116,7 @@ void _SMP_Handler_initialize( void )
   for ( cpu_index = 0 ; cpu_index < cpu_config_max; ++cpu_index ) {
     Per_CPU_Control *cpu = _Per_CPU_Get_by_index( cpu_index );
 
-    _ISR_lock_Initialize( &cpu->Watchdog.Lock, "Watchdog" );
+    _ISR_lock_Set_name( &cpu->Watchdog.Lock, "Watchdog" );
     _SMP_ticket_lock_Initialize( &cpu->Lock );
     _SMP_lock_Stats_initialize( &cpu->Lock_stats, "Per-CPU" );
     _Chain_Initialize_empty( &cpu->Threads_in_need_for_help );
diff --git a/testsuites/sptests/sp37/init.c b/testsuites/sptests/sp37/init.c
index 1a63298d3b..22c7d4f2ef 100644
--- a/testsuites/sptests/sp37/init.c
+++ b/testsuites/sptests/sp37/init.c
@@ -169,24 +169,36 @@ static void test_isr_level( void )
 
 static void test_isr_locks( void )
 {
+  static const char name[] = "test";
   ISR_Level normal_interrupt_level = _ISR_Get_level();
-  ISR_lock_Control initialized = ISR_LOCK_INITIALIZER("test");
+  ISR_lock_Control initialized = ISR_LOCK_INITIALIZER( name );
+  ISR_lock_Control zero_initialized;
   union {
     ISR_lock_Control lock;
     uint8_t bytes[ sizeof( ISR_lock_Control ) ];
   } container;
   ISR_lock_Context lock_context;
   size_t i;
-  const uint8_t *initialized_bytes;
+  const uint8_t *bytes;
   ISR_Level interrupt_level;
 
   memset( &container, 0xff, sizeof( container ) );
-  _ISR_lock_Initialize( &container.lock, "test" );
-  initialized_bytes = (const uint8_t *) &initialized;
+  _ISR_lock_Initialize( &container.lock, name );
+  bytes = (const uint8_t *) &initialized;
 
   for ( i = 0; i < sizeof( container ); ++i ) {
     if ( container.bytes[ i ] != 0xff ) {
-      rtems_test_assert( container.bytes[ i ] == initialized_bytes[ i] );
+      rtems_test_assert( container.bytes[ i ] == bytes[ i ] );
+    }
+  }
+
+  memset( &zero_initialized, 0, sizeof( zero_initialized ) );
+  _ISR_lock_Set_name( &zero_initialized, name );
+  bytes = (const uint8_t *) &zero_initialized;
+
+  for ( i = 0; i < sizeof( container ); ++i ) {
+    if ( container.bytes[ i ] != 0xff ) {
+      rtems_test_assert( container.bytes[ i ] == bytes[ i ] );
     }
   }
 
-- 
2.16.4




More information about the devel mailing list