forked from Imagelibrary/rtems
score: Add _ISR_lock_Set_name()
Add _ISR_lock_Set_name() to optimize the initialization of zero-initialized locks.
This commit is contained in:
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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 )
|
||||
{
|
||||
|
||||
@@ -114,11 +114,12 @@ void _SMP_Handler_initialize( void )
|
||||
cpu_config_max = rtems_configuration_get_maximum_processors();
|
||||
|
||||
for ( cpu_index = 0 ; cpu_index < cpu_config_max; ++cpu_index ) {
|
||||
Per_CPU_Control *cpu = _Per_CPU_Get_by_index( cpu_index );
|
||||
Per_CPU_Control *cpu;
|
||||
|
||||
_ISR_lock_Initialize( &cpu->Watchdog.Lock, "Watchdog" );
|
||||
cpu = _Per_CPU_Get_by_index( cpu_index );
|
||||
_SMP_ticket_lock_Initialize( &cpu->Lock );
|
||||
_SMP_lock_Stats_initialize( &cpu->Lock_stats, "Per-CPU" );
|
||||
_ISR_lock_Set_name( &cpu->Watchdog.Lock, "Per-CPU Watchdog" );
|
||||
_Chain_Initialize_empty( &cpu->Threads_in_need_for_help );
|
||||
}
|
||||
|
||||
|
||||
@@ -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 ] );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user