diff options
Diffstat (limited to 'cpukit/score/src/userextaddset.c')
-rw-r--r-- | cpukit/score/src/userextaddset.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/cpukit/score/src/userextaddset.c b/cpukit/score/src/userextaddset.c index 2b13dfad62..70e9fb008f 100644 --- a/cpukit/score/src/userextaddset.c +++ b/cpukit/score/src/userextaddset.c @@ -20,8 +20,28 @@ #endif #include <rtems/score/userextimpl.h> +#include <rtems/score/smp.h> #include <rtems/score/percpu.h> +static void _User_extensions_Set_ancestors( void ) +{ +#if defined(RTEMS_SMP) + if ( _Chain_Is_empty( &_User_extensions_Switches_list ) ) { + uint32_t cpu_max; + uint32_t cpu_index; + + cpu_max = _SMP_Get_processor_maximum(); + + for ( cpu_index = 0 ; cpu_index < cpu_max ; ++cpu_index ) { + Per_CPU_Control *cpu; + + cpu = _Per_CPU_Get_by_index( cpu_index ); + cpu->ancestor = cpu->executing; + } + } +#endif +} + void _User_extensions_Add_set( User_extensions_Control *the_extension ) @@ -45,6 +65,7 @@ void _User_extensions_Add_set( the_extension->Callouts.thread_switch; _Per_CPU_Acquire_all( &lock_context ); + _User_extensions_Set_ancestors(); _Chain_Initialize_node( &the_extension->Switch.Node ); _Chain_Append_unprotected( &_User_extensions_Switches_list, |