X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/49ee23364e64238e221aa5a06e142b24d28a7b1c..a3a9277b2d833bad63f6ca22dcf9cc563fbe0f68:/src/xbt/xbt_context_sysv.c diff --git a/src/xbt/xbt_context_sysv.c b/src/xbt/xbt_context_sysv.c index bf0558853e..821b501f21 100644 --- a/src/xbt/xbt_context_sysv.c +++ b/src/xbt/xbt_context_sysv.c @@ -1,3 +1,11 @@ +/* $Id$ */ + +/* context_sysv - implementation of context switching with ucontextes from Sys V */ + +/* Copyright (c) 2004-2008 the SimGrid team. All right reserved */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ #include "xbt/ex_interface.h" #include "xbt/xbt_context_private.h" @@ -6,12 +14,20 @@ #include "portable.h" #include /* context relative declarations */ #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 */ + +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 */ + 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 */ } s_xbt_ctx_sysv_t, *xbt_ctx_sysv_t; @@ -93,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); @@ -118,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; @@ -130,6 +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 */ context->exception = xbt_new(ex_ctx_t, 1); XBT_CTX_INITIALIZE(context->exception); @@ -170,6 +195,10 @@ 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 */ + /* finally destroy the context */ free(context); } @@ -177,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); } @@ -192,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); @@ -207,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); @@ -214,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); @@ -230,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"); @@ -255,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); @@ -270,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;