From 6f6da82ca0b57ed1c42050f8103c2ea2adb3d3e2 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 26 Jan 2017 11:06:50 +0100 Subject: 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. --- cpukit/score/src/userextiterate.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) (limited to 'cpukit/score/src') 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 ); + } + } } -- cgit v1.2.3