summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/userext.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-04-12 17:02:27 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-04-18 08:20:15 +0200
commit0a97ba5bc118bce28b718dc12069f02087d52692 (patch)
tree1d201ae543ee94fe1cb3379e0420812d67a071fb /cpukit/score/src/userext.c
parentsapi: Avoid Giant lock for extensions (diff)
downloadrtems-0a97ba5bc118bce28b718dc12069f02087d52692.tar.bz2
score: _User_extensions_Handler_initialization()
Simplify _User_extensions_Handler_initialization().
Diffstat (limited to 'cpukit/score/src/userext.c')
-rw-r--r--cpukit/score/src/userext.c51
1 files changed, 23 insertions, 28 deletions
diff --git a/cpukit/score/src/userext.c b/cpukit/score/src/userext.c
index 1ac622e093..b4d4b0aa3d 100644
--- a/cpukit/score/src/userext.c
+++ b/cpukit/score/src/userext.c
@@ -23,37 +23,32 @@
#include <rtems/score/userextimpl.h>
#include <rtems/score/wkspace.h>
-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
-)
+void _User_extensions_Handler_initialization(void)
{
- User_extensions_thread_switch_extension callout = callouts->thread_switch;
+ User_extensions_Switch_control *initial_extension_switch_controls;
+ const User_extensions_Table *initial_table;
+ uint32_t n;
+ uint32_t i;
- if ( callout != NULL ) {
- User_extensions_Switch_context *ctx = arg;
- User_extensions_Switch_control *ctrl = ctx->switch_control;
+ n = rtems_configuration_get_number_of_initial_extensions();
- _Chain_Append_unprotected( &_User_extensions_Switches_list, &ctrl->Node );
- ctrl->thread_switch = callout;
+ initial_extension_switch_controls = _Workspace_Allocate_or_fatal_error(
+ n * sizeof( *initial_extension_switch_controls )
+ );
- ctx->switch_control = ctrl + 1;
- }
-}
+ initial_table = rtems_configuration_get_user_extension_table();
-void _User_extensions_Handler_initialization(void)
-{
- User_extensions_Switch_control *initial_extension_switch_controls =
- _Workspace_Allocate_or_fatal_error(
- rtems_configuration_get_number_of_initial_extensions()
- * sizeof( *initial_extension_switch_controls )
- );
- User_extensions_Switch_context ctx = { initial_extension_switch_controls };
-
- _User_extensions_Iterate( &ctx, _User_extensions_Switch_visitor );
+ for ( i = 0 ; i < n ; ++i ) {
+ User_extensions_thread_switch_extension callout;
+
+ callout = initial_table[ i ].thread_switch;
+
+ if ( callout != NULL ) {
+ User_extensions_Switch_control *c;
+
+ c = &initial_extension_switch_controls[ i ];
+ c->thread_switch = callout;
+ _Chain_Append_unprotected( &_User_extensions_Switches_list, &c->Node );
+ }
+ }
}