X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c4e3a3e34e94ed337b089eb6339bf9b6fd5b9657..c415c91f074a3047abd92a7d63b59baf1c61f51a:/src/xbt/context.c diff --git a/src/xbt/context.c b/src/xbt/context.c index e84ffa25fc..d371757b8f 100644 --- a/src/xbt/context.c +++ b/src/xbt/context.c @@ -16,10 +16,10 @@ #include "gras_config.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(context, xbt, "Context"); -#define WARNING(format, ...) (fprintf(stderr, "[%s , %s : %d] ", __FILE__, __FUNCTION__, __LINE__),\ - fprintf(stderr, format, ## __VA_ARGS__), \ - fprintf(stderr, "\n")) -#define VOIRP(expr) WARNING(" {" #expr " = %p }", expr) +/* #define WARNING(format, ...) (fprintf(stderr, "[%s , %s : %d] ", __FILE__, __FUNCTION__, __LINE__),\ */ +/* fprintf(stderr, format, ## __VA_ARGS__), \ */ +/* fprintf(stderr, "\n")) */ +/* #define VOIRP(expr) WARNING(" {" #expr " = %p }", expr) */ #ifndef HAVE_UCONTEXT_H /* don't want to play with conditional compilation in automake tonight, sorry. @@ -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; @@ -141,12 +149,18 @@ xbt_context_t xbt_context_new(xbt_context_function_t code, res->code = code; res->uc.uc_link = NULL; + res->argc = argc; + res->argv = argv; /* res->uc.uc_link = &(current_context->uc); */ /* WARNING : when this context is over, the current_context (i.e. the father), is awaken... Theorically, the wrapper should prevent using 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);