From: alegrand Date: Wed, 29 Dec 2004 03:11:03 +0000 (+0000) Subject: add a startup and a cleanup function to each context X-Git-Tag: v3.3~4651 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/23165373290ff54efcd5c8bf8ec09dc135e66f4b add a startup and a cleanup function to each context git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@699 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/include/xbt/context.h b/include/xbt/context.h index 656caaecc3..e035c7bae4 100644 --- a/include/xbt/context.h +++ b/include/xbt/context.h @@ -8,13 +8,18 @@ #ifndef _XBT_CONTEXT_H #define _XBT_CONTEXT_H +#include "xbt/misc.h" + typedef struct s_xbt_context *xbt_context_t; typedef int(*xbt_context_function_t)(int argc, char *argv[]); void xbt_context_init(void); void xbt_context_exit(void); void xbt_context_empty_trash(void); -xbt_context_t xbt_context_new(xbt_context_function_t code, int argc, char *argv[]); +xbt_context_t xbt_context_new(xbt_context_function_t code, + void_f_pvoid_t startup_func, void *startup_arg, + void_f_pvoid_t cleanup_func, void *cleanup_arg, + int argc, char *argv[]); void xbt_context_start(xbt_context_t context); void xbt_context_yield(void); void xbt_context_schedule(xbt_context_t context); diff --git a/src/xbt/context.c b/src/xbt/context.c index 685e230c87..d371757b8f 100644 --- a/src/xbt/context.c +++ b/src/xbt/context.c @@ -104,6 +104,9 @@ static void *__context_wrapper(void *c) /* msg_global->current_process = process; */ + if(context->startup_func) + context->startup_func(context->startup_arg); + /* WARNING("Calling the main function"); */ /* xbt_context_yield(context); */ (context->code) (context->argc,context->argv); @@ -112,11 +115,14 @@ static void *__context_wrapper(void *c) if(context->argv[i]) xbt_free(context->argv[i]); if(context->argv) xbt_free(context->argv); + if(context->cleanup_func) + context->cleanup_func(context->cleanup_arg); + xbt_swag_remove(context, context_living); xbt_swag_insert(context, context_to_destroy); __xbt_context_yield(context); - + xbt_assert0(0,"You're cannot be here!"); return NULL; } @@ -130,8 +136,10 @@ void xbt_context_start(xbt_context_t context) return; } -xbt_context_t xbt_context_new(xbt_context_function_t code, - int argc, char *argv[]) +xbt_context_t xbt_context_new(xbt_context_function_t code, + void_f_pvoid_t startup_func, void *startup_arg, + void_f_pvoid_t cleanup_func, void *cleanup_arg, + int argc, char *argv[]) { xbt_context_t res = NULL; @@ -149,6 +157,10 @@ xbt_context_t xbt_context_new(xbt_context_function_t code, this feature. */ res->uc.uc_stack.ss_sp = res->stack; res->uc.uc_stack.ss_size = STACK_SIZE; + res->startup_func = startup_func; + res->startup_arg = startup_arg; + res->cleanup_func = cleanup_func; + res->cleanup_arg = cleanup_arg; xbt_swag_insert(res, context_living); diff --git a/src/xbt/context_private.h b/src/xbt/context_private.h index 57330ca13b..dde53e787b 100644 --- a/src/xbt/context_private.h +++ b/src/xbt/context_private.h @@ -23,6 +23,10 @@ typedef struct s_xbt_context { int argc; char **argv; struct s_xbt_context *save; + void_f_pvoid_t *startup_func; + void *startup_arg; + void_f_pvoid_t *cleanup_func; + void *cleanup_arg; } s_xbt_context_t; #endif /* _XBT_CONTEXT_PRIVATE_H */