summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/userext.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/score/src/userext.c')
-rw-r--r--cpukit/score/src/userext.c59
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 );
}
}
-