diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-11-07 10:11:17 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-11-13 09:20:57 +0100 |
commit | e5ae7c927c793fbb66fd00697d61aeb27c4c6e2c (patch) | |
tree | 032ce0fe42ea3ee56a78898785a422f13198b3f0 /cpukit/score/src/userextiterate.c | |
parent | score: Add and use RTEMS_ARRAY_SIZE() (diff) | |
download | rtems-e5ae7c927c793fbb66fd00697d61aeb27c4c6e2c.tar.bz2 |
score: Add and use _User_extensions_Iterate()
Replace the separate user extension iterations with a single iteration
function. This reduces code size and improves maintainability since the
iteration logic is only in one function. The runtime overhead is
insignificant.
Diffstat (limited to 'cpukit/score/src/userextiterate.c')
-rw-r--r-- | cpukit/score/src/userextiterate.c | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/cpukit/score/src/userextiterate.c b/cpukit/score/src/userextiterate.c new file mode 100644 index 0000000000..9f645e5056 --- /dev/null +++ b/cpukit/score/src/userextiterate.c @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2012 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Obere Lagerstr. 30 + * 82178 Puchheim + * Germany + * <rtems@embedded-brains.de> + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ + +#if HAVE_CONFIG_H + #include "config.h" +#endif + +#include <rtems/score/userext.h> + +void _User_extensions_Thread_create_visitor( + Thread_Control *executing, + void *arg, + const User_extensions_Table *callouts +) +{ + User_extensions_thread_create_extension callout = callouts->thread_create; + + if ( callout != NULL ) { + User_extensions_Thread_create_context *ctx = arg; + + ctx->ok = ctx->ok && (*callout)( executing, ctx->created ); + } +} + +void _User_extensions_Thread_delete_visitor( + Thread_Control *executing, + void *arg, + const User_extensions_Table *callouts +) +{ + User_extensions_thread_delete_extension callout = callouts->thread_delete; + + if ( callout != NULL ) { + (*callout)( executing, arg ); + } +} + +void _User_extensions_Thread_start_visitor( + Thread_Control *executing, + void *arg, + const User_extensions_Table *callouts +) +{ + User_extensions_thread_start_extension callout = callouts->thread_start; + + if ( callout != NULL ) { + (*callout)( executing, arg ); + } +} + +void _User_extensions_Thread_restart_visitor( + Thread_Control *executing, + void *arg, + const User_extensions_Table *callouts +) +{ + User_extensions_thread_restart_extension callout = callouts->thread_restart; + + if ( callout != NULL ) { + (*callout)( executing, arg ); + } +} + +void _User_extensions_Thread_begin_visitor( + Thread_Control *executing, + void *arg, + const User_extensions_Table *callouts +) +{ + User_extensions_thread_begin_extension callout = callouts->thread_begin; + + if ( callout != NULL ) { + (*callout)( executing ); + } +} + +void _User_extensions_Thread_exitted_visitor( + Thread_Control *executing, + void *arg, + const User_extensions_Table *callouts +) +{ + User_extensions_thread_exitted_extension callout = callouts->thread_exitted; + + if ( callout != NULL ) { + (*callout)( executing ); + } +} + +void _User_extensions_Fatal_visitor( + Thread_Control *executing, + void *arg, + const User_extensions_Table *callouts +) +{ + User_extensions_fatal_extension callout = callouts->fatal; + + if ( callout != NULL ) { + const User_extensions_Fatal_context *ctx = arg; + + (*callout)( ctx->source, ctx->is_internal, ctx->error ); + } +} + +void _User_extensions_Iterate( + void *arg, + 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; + + while ( node != tail ) { + const User_extensions_Control *extension = + (const User_extensions_Control *) node; + + (*visitor)( executing, arg, &extension->Callouts ); + + node = _Chain_Immutable_next( node ); + } +} |