X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/34c6518ab6cdb0b402cca01ac045561cba9bd009..40b9540a553006e50628eb13c451c354a0671d3e:/src/xbt/xbt_context_sysv.c diff --git a/src/xbt/xbt_context_sysv.c b/src/xbt/xbt_context_sysv.c index 7a1bbbdc83..821b501f21 100644 --- a/src/xbt/xbt_context_sysv.c +++ b/src/xbt/xbt_context_sysv.c @@ -16,18 +16,18 @@ #define STACK_SIZE 128*1024 /* lower this if you want to reduce the memory consumption */ #ifdef HAVE_VALGRIND_VALGRIND_H # include -#endif /* HAVE_VALGRIND_VALGRIND_H */ - +#endif /* HAVE_VALGRIND_VALGRIND_H */ +XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(xbt_context); typedef struct s_xbt_ctx_sysv { XBT_CTX_BASE_T; - ucontext_t uc; /* the thread that execute the code */ - char stack[STACK_SIZE]; /* the thread stack size */ - struct s_xbt_ctx_sysv *prev; /* the previous thread */ + ucontext_t uc; /* the thread that execute the code */ + char stack[STACK_SIZE]; /* the thread stack size */ + struct s_xbt_ctx_sysv *prev; /* the previous thread */ #ifdef HAVE_VALGRIND_VALGRIND_H - unsigned int valgrind_stack_id; /* the valgrind stack id. */ -#endif /* HAVE_VALGRIND_VALGRIND_H */ + unsigned int valgrind_stack_id; /* the valgrind stack id. */ +#endif /* HAVE_VALGRIND_VALGRIND_H */ } s_xbt_ctx_sysv_t, *xbt_ctx_sysv_t; @@ -109,6 +109,8 @@ xbt_ctx_sysv_factory_create_maestro_context(xbt_context_t * maestro) xbt_ctx_sysv_t context = xbt_new0(s_xbt_ctx_sysv_t, 1); + context->name = (char *) "maestro"; + context->exception = xbt_new(ex_ctx_t, 1); XBT_CTX_INITIALIZE(context->exception); @@ -134,6 +136,7 @@ xbt_ctx_sysv_factory_create_context(const char *name, xbt_main_func_t code, void_f_pvoid_t cleanup_func, void *cleanup_arg, int argc, char **argv) { + VERB1("Create context %s", name); xbt_ctx_sysv_t context = xbt_new0(s_xbt_ctx_sysv_t, 1); context->code = code; @@ -146,12 +149,12 @@ xbt_ctx_sysv_factory_create_context(const char *name, xbt_main_func_t code, pth_skaddr_makecontext(context->stack, STACK_SIZE); context->uc.uc_stack.ss_size = pth_sksize_makecontext(context->stack, STACK_SIZE); - #ifdef HAVE_VALGRIND_VALGRIND_H - context->valgrind_stack_id = VALGRIND_STACK_REGISTER( - context->uc.uc_stack.ss_sp, - ((char *)context->uc.uc_stack.ss_sp) + context->uc.uc_stack.ss_size - ); - #endif /* HAVE_VALGRIND_VALGRIND_H */ +#ifdef HAVE_VALGRIND_VALGRIND_H + context->valgrind_stack_id = + VALGRIND_STACK_REGISTER(context->uc.uc_stack.ss_sp, + ((char *) context->uc.uc_stack.ss_sp) + + context->uc.uc_stack.ss_size); +#endif /* HAVE_VALGRIND_VALGRIND_H */ context->exception = xbt_new(ex_ctx_t, 1); XBT_CTX_INITIALIZE(context->exception); @@ -192,9 +195,9 @@ static void xbt_ctx_sysv_free(xbt_context_t context) if (context->exception) free(context->exception); - #ifdef HAVE_VALGRIND_VALGRIND_H - VALGRIND_STACK_DEREGISTER(((xbt_ctx_sysv_t)context)->valgrind_stack_id); - #endif /* HAVE_VALGRIND_VALGRIND_H */ +#ifdef HAVE_VALGRIND_VALGRIND_H + VALGRIND_STACK_DEREGISTER(((xbt_ctx_sysv_t) context)->valgrind_stack_id); +#endif /* HAVE_VALGRIND_VALGRIND_H */ /* finally destroy the context */ free(context); @@ -203,6 +206,8 @@ static void xbt_ctx_sysv_free(xbt_context_t context) static void xbt_ctx_sysv_kill(xbt_context_t context) { + DEBUG2("Kill context '%s' (from '%s')", context->name, + current_context->name); context->iwannadie = 1; xbt_ctx_sysv_swap(context); } @@ -218,6 +223,7 @@ static void xbt_ctx_sysv_kill(xbt_context_t context) */ static void xbt_ctx_sysv_schedule(xbt_context_t context) { + DEBUG1("Schedule context '%s'", context->name); xbt_assert0((current_context == maestro_context), "You are not supposed to run this function here!"); xbt_ctx_sysv_swap(context); @@ -233,6 +239,7 @@ static void xbt_ctx_sysv_schedule(xbt_context_t context) */ static void xbt_ctx_sysv_yield(void) { + DEBUG1("Yielding context '%s'", current_context->name); xbt_assert0((current_context != maestro_context), "You are not supposed to run this function here!"); xbt_ctx_sysv_swap(current_context); @@ -240,11 +247,13 @@ static void xbt_ctx_sysv_yield(void) static void xbt_ctx_sysv_start(xbt_context_t context) { + DEBUG1("Start context '%s'", context->name); makecontext(&(((xbt_ctx_sysv_t) context)->uc), xbt_ctx_sysv_wrapper, 0); } static void xbt_ctx_sysv_stop(int exit_code) { + /* please no debug here: our procdata was already free'd */ if (current_context->cleanup_func) ((*current_context->cleanup_func)) (current_context->cleanup_arg); @@ -256,6 +265,7 @@ static void xbt_ctx_sysv_stop(int exit_code) static void xbt_ctx_sysv_swap(xbt_context_t context) { + DEBUG2("Swap context: '%s' -> '%s'", current_context->name, context->name); xbt_assert0(current_context, "You have to call context_init() first."); xbt_assert0(context, "Invalid argument"); @@ -281,6 +291,7 @@ static void xbt_ctx_sysv_suspend(xbt_context_t context) { int rv; + DEBUG1("Suspend context: '%s'", current_context->name); xbt_ctx_sysv_t prev_context = ((xbt_ctx_sysv_t) context)->prev; current_context = (xbt_context_t) (((xbt_ctx_sysv_t) context)->prev); @@ -296,6 +307,8 @@ static void xbt_ctx_sysv_resume(xbt_context_t context) { int rv; + DEBUG2("Resume context: '%s' (from '%s')", context->name, + current_context->name); ((xbt_ctx_sysv_t) context)->prev = (xbt_ctx_sysv_t) current_context; current_context = context;