diff options
Diffstat (limited to 'cpukit/score/src/userext.c')
-rw-r--r-- | cpukit/score/src/userext.c | 59 |
1 files changed, 33 insertions, 26 deletions
diff --git a/cpukit/score/src/userext.c b/cpukit/score/src/userext.c index 4b81daa4ea..78162f6cdd 100644 --- a/cpukit/score/src/userext.c +++ b/cpukit/score/src/userext.c @@ -16,44 +16,51 @@ */ #if HAVE_CONFIG_H -#include "config.h" + #include "config.h" #endif -#include <rtems/system.h> #include <rtems/config.h> #include <rtems/score/userext.h> #include <rtems/score/wkspace.h> -#include <string.h> -void _User_extensions_Handler_initialization(void) +CHAIN_DEFINE_EMPTY( _User_extensions_Switches_list ); + +typedef struct { + User_extensions_Switch_control *switch_control; +} User_extensions_Switch_context; + +static void _User_extensions_Switch_visitor( + Thread_Control *executing, + void *arg, + const User_extensions_Table *callouts +) { - User_extensions_Control *extension; - uint32_t i; - uint32_t number_of_extensions; - const User_extensions_Table *initial_extensions; + User_extensions_thread_switch_extension callout = callouts->thread_switch; - number_of_extensions = rtems_configuration_get_number_of_initial_extensions(); - initial_extensions = rtems_configuration_get_user_extension_table(); + if ( callout != NULL ) { + User_extensions_Switch_context *ctx = arg; + User_extensions_Switch_control *ctrl = ctx->switch_control; - _Chain_Initialize_empty( &_User_extensions_List ); - _Chain_Initialize_empty( &_User_extensions_Switches_list ); + _Chain_Append_unprotected( &_User_extensions_Switches_list, &ctrl->Node ); + ctrl->thread_switch = callout; + + ctx->switch_control = ctrl + 1; + } +} - if ( initial_extensions ) { - extension = (User_extensions_Control *) +void _User_extensions_Handler_initialization(void) +{ + uint32_t number_of_initial_extensions = + rtems_configuration_get_number_of_initial_extensions(); + + if ( number_of_initial_extensions > 0 ) { + User_extensions_Switch_control *initial_extension_switch_controls = _Workspace_Allocate_or_fatal_error( - number_of_extensions * sizeof( User_extensions_Control ) + number_of_initial_extensions + * sizeof( *initial_extension_switch_controls ) ); + User_extensions_Switch_context ctx = { initial_extension_switch_controls }; - memset ( - extension, - 0, - number_of_extensions * sizeof( User_extensions_Control ) - ); - - for ( i = 0 ; i < number_of_extensions ; i++ ) { - _User_extensions_Add_set_with_table (extension, &initial_extensions[i]); - extension++; - } + _User_extensions_Iterate( &ctx, _User_extensions_Switch_visitor ); } } - |