From: alegrand Date: Sat, 2 Jul 2005 05:30:14 +0000 (+0000) Subject: Make context exception-aware. I don't know whether it works or not, though... X-Git-Tag: v3.3~3817 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/c0b1cd463d680c1690999e7066fcc75b2c903752?hp=837788ebd988892ad55ee58b2ff15c1c9c93a319 Make context exception-aware. I don't know whether it works or not, though... git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@1539 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/src/xbt/context.c b/src/xbt/context.c index 1ca6c8acb8..a4f1096b65 100644 --- a/src/xbt/context.c +++ b/src/xbt/context.c @@ -140,6 +140,18 @@ static void *__context_wrapper(void *c) return NULL; } +/* callback: context fetching */ +static ex_ctx_t *__context_ex_ctx(void) +{ + return current_context->exception; +} + +/* callback: termination */ +static void __context_ex_terminate(ex_t *e) +{ + exit(e->value); +} + /** \name Functions * \ingroup XBT_context */ @@ -152,6 +164,10 @@ void xbt_context_init(void) { if(!current_context) { current_context = init_context = xbt_new0(s_xbt_context_t,1); + init_context->exception = xbt_new(ex_ctx_t,1); + XBT_CTX_INITIALIZE(init_context->exception); + __xbt_ex_ctx = __context_ex_ctx; + __xbt_ex_terminate = __context_ex_terminate; context_to_destroy = xbt_swag_new(xbt_swag_offset(*current_context,hookup)); context_living = xbt_swag_new(xbt_swag_offset(*current_context,hookup)); xbt_swag_insert(init_context, context_living); @@ -241,6 +257,8 @@ xbt_context_t xbt_context_new(xbt_context_function_t code, res->startup_arg = startup_arg; res->cleanup_func = cleanup_func; res->cleanup_arg = cleanup_arg; + res->exception = xbt_new(ex_ctx_t,1); + XBT_CTX_INITIALIZE(res->exception); xbt_swag_insert(res, context_living); @@ -302,6 +320,7 @@ void xbt_context_free(xbt_context_t context) for(i=0;iargc; i++) if(context->argv[i]) free(context->argv[i]); if(context->argv) free(context->argv); + if(context->exception) free(context->exception); if(context->cleanup_func) context->cleanup_func(context->cleanup_arg); diff --git a/src/xbt/context_private.h b/src/xbt/context_private.h index 9e1d69dfe6..269fb1fb28 100644 --- a/src/xbt/context_private.h +++ b/src/xbt/context_private.h @@ -16,6 +16,7 @@ #include "ucontext_stack.h" /* loads context system definitions */ #include "xbt/context.h" +#include "xbt/ex.h" #ifdef S_SPLINT_S /* Dummy definition for splint since it chokes on ucontext.h */ @@ -52,6 +53,7 @@ typedef struct s_xbt_context { void *startup_arg; void_f_pvoid_t *cleanup_func; void *cleanup_arg; + ex_ctx_t *exception; /* exception */ } s_xbt_context_t; #else