diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-01-26 11:06:50 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-01-26 11:20:45 +0100 |
commit | 6f6da82ca0b57ed1c42050f8103c2ea2adb3d3e2 (patch) | |
tree | 0a2384e1eed6247010b5d890d078212227956a2a /cpukit/score/src | |
parent | sapi: Add rtems_task_terminate_extension (diff) | |
download | rtems-6f6da82ca0b57ed1c42050f8103c2ea2adb3d3e2.tar.bz2 |
score: Fix user extensions order
Use forward and reverse order for initial and dynamic extensions. This
is the behaviour documented in the C Users Guide. Change thread
terminate order to backward to be in line with the thread delete order.
Change fatal error order to forward to ensure that initial extensions
are called first due the peculiar execution context of fatal error
extensions, see _Terminate() documentation.
Update #2692.
Diffstat (limited to 'cpukit/score/src')
-rw-r--r-- | cpukit/score/src/userextiterate.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/cpukit/score/src/userextiterate.c b/cpukit/score/src/userextiterate.c index 6e143765c2..04fe278639 100644 --- a/cpukit/score/src/userextiterate.c +++ b/cpukit/score/src/userextiterate.c @@ -7,7 +7,7 @@ */ /* - * Copyright (c) 2012, 2016 embedded brains GmbH. All rights reserved. + * Copyright (c) 2012, 2017 embedded brains GmbH. All rights reserved. * * embedded brains GmbH * Dornierstr. 4 @@ -154,8 +154,9 @@ void _User_extensions_Iterate( ) { Thread_Control *executing; - const User_extensions_Table *callouts_current; - const User_extensions_Table *callouts_end; + const User_extensions_Table *initial_current; + const User_extensions_Table *initial_begin; + const User_extensions_Table *initial_end; const Chain_Node *end; Chain_Node *node; User_extensions_Iterator iter; @@ -163,17 +164,18 @@ void _User_extensions_Iterate( executing = _Thread_Get_executing(); - callouts_current = rtems_configuration_get_user_extension_table(); - callouts_end = callouts_current - + rtems_configuration_get_number_of_initial_extensions(); + initial_begin = rtems_configuration_get_user_extension_table(); + initial_end = + initial_begin + rtems_configuration_get_number_of_initial_extensions(); - while ( callouts_current != callouts_end ) { - (*visitor)( executing, arg, callouts_current ); + if ( direction == CHAIN_ITERATOR_FORWARD ) { + initial_current = initial_begin; - ++callouts_current; - } + while ( initial_current != initial_end ) { + (*visitor)( executing, arg, initial_current ); + ++initial_current; + } - if ( direction == CHAIN_ITERATOR_FORWARD ) { end = _Chain_Immutable_tail( &_User_extensions_List.Active ); } else { end = _Chain_Immutable_head( &_User_extensions_List.Active ); @@ -213,4 +215,13 @@ void _User_extensions_Iterate( _Chain_Iterator_destroy( &iter.Iterator ); _User_extensions_Release( &lock_context ); + + if ( direction == CHAIN_ITERATOR_BACKWARD ) { + initial_current = initial_end; + + while ( initial_current != initial_begin ) { + --initial_current; + (*visitor)( executing, arg, initial_current ); + } + } } |