summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2017-01-26 11:06:50 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-01-26 11:20:45 +0100
commit6f6da82ca0b57ed1c42050f8103c2ea2adb3d3e2 (patch)
tree0a2384e1eed6247010b5d890d078212227956a2a /cpukit/score/src
parentsapi: Add rtems_task_terminate_extension (diff)
downloadrtems-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.c33
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 );
+ }
+ }
}