diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-11-07 13:59:19 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-11-13 09:20:57 +0100 |
commit | 466cf31d81cf0cc5fd659aed0924a1f6ee7d18be (patch) | |
tree | d1381235011ecaced397b15ba14e4522dd8db72c /cpukit/score/src/userextiterate.c | |
parent | score: Add and use _User_extensions_Iterate() (diff) | |
download | rtems-466cf31d81cf0cc5fd659aed0924a1f6ee7d18be.tar.bz2 |
score: Statically initialize user extensions
The initial extensions remain now in a read-only table and will not be
copied to work space memory. The extension chains are statically
initialized. This makes it possible to call _User_extensions_Iterate()
independent of the system state. It is now guaranteed that the fatal
callout of the initial extensions will be called provided the stack
pointer, the read-only data, and code memory are valid.
Diffstat (limited to 'cpukit/score/src/userextiterate.c')
-rw-r--r-- | cpukit/score/src/userextiterate.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/cpukit/score/src/userextiterate.c b/cpukit/score/src/userextiterate.c index 9f645e5056..bab63ef99b 100644 --- a/cpukit/score/src/userextiterate.c +++ b/cpukit/score/src/userextiterate.c @@ -16,8 +16,11 @@ #include "config.h" #endif +#include <rtems/config.h> #include <rtems/score/userext.h> +CHAIN_DEFINE_EMPTY( _User_extensions_List ); + void _User_extensions_Thread_create_visitor( Thread_Control *executing, void *arg, @@ -118,10 +121,22 @@ void _User_extensions_Iterate( User_extensions_Visitor visitor ) { - const Chain_Node *node = _Chain_Immutable_first( &_User_extensions_List ); - const Chain_Node *tail = _Chain_Immutable_tail( &_User_extensions_List ); Thread_Control *executing = _Thread_Executing; + const User_extensions_Table *callouts_current = + rtems_configuration_get_user_extension_table(); + const User_extensions_Table *callouts_end = + callouts_current + rtems_configuration_get_number_of_initial_extensions(); + const Chain_Node *node; + const Chain_Node *tail; + + while ( callouts_current != callouts_end ) { + (*visitor)( executing, arg, callouts_current ); + + ++callouts_current; + } + node = _Chain_Immutable_first( &_User_extensions_List ); + tail = _Chain_Immutable_tail( &_User_extensions_List ); while ( node != tail ) { const User_extensions_Control *extension = (const User_extensions_Control *) node; |