X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c829167929dfa54fafb6d016ff750765785e2686..02201118960697772e289bddc4ad32b78973fe36:/include/xbt/ex.h diff --git a/include/xbt/ex.h b/include/xbt/ex.h index 8d73645118..12b63acbe5 100644 --- a/include/xbt/ex.h +++ b/include/xbt/ex.h @@ -1,33 +1,15 @@ -/* -** OSSP ex - Exception Handling (modified to fit into SimGrid) -** Copyright (c) 2005 Martin Quinson. -** Copyright (c) 2002-2004 Ralf S. Engelschall -** Copyright (c) 2002-2004 The OSSP Project -** Copyright (c) 2002-2004 Cable & Wireless -** -** This file is part of OSSP ex, an exception handling library -** which can be found at http://www.ossp.org/pkg/lib/ex/. -** -** Permission to use, copy, modify, and distribute this software for -** any purpose with or without fee is hereby granted, provided that -** the above copyright notice and this permission notice appear in all -** copies. -** -** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED -** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -** SUCH DAMAGE. -** -** ex.h: exception handling (pre-processor part) -*/ +/* $Id$ */ + +/* ex - Exception Handling (modified to fit into SimGrid from OSSP version) */ + +/* Copyright (c) 2005-2006 Martin Quinson */ +/* Copyright (c) 2002-2004 Ralf S. Engelschall */ +/* Copyright (c) 2002-2004 The OSSP Project */ +/* Copyright (c) 2002-2004 Cable & Wireless */ +/* All rights 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. */ #ifndef __XBT_EX_H__ #define __XBT_EX_H__ @@ -43,6 +25,33 @@ extern int backtrace (void **__array, int __size); #include #include + +/*-*-* Emergency debuging: define this when the exceptions get crazy *-*-*/ +#undef __EX_MAYDAY + +#ifdef __EX_MAYDAY +int gras_os_getpid(void); +# define MAYDAY_SAVE(m) printf("%d %s:%d save %p\n", \ + gras_os_getpid(),__FILE__,__LINE__, \ + (m)->jb \ + ), +# define MAYDAY_RESTORE(m) printf("%d %s:%d restore %p\n", \ + gras_os_getpid(),__FILE__,__LINE__, \ + (m)->jb \ + ), +# define MAYDAY_CATCH(e) printf("%d %s:%d Catched '%s'\n", \ + gras_os_getpid(),__FILE__,__LINE__, \ + e.msg \ + ), +#else +# define MAYDAY_SAVE(m) +# define MAYDAY_RESTORE(m) +# define MAYDAY_CATCH(e) +#endif + +/*-*-* end of debugging stuff *-*-*/ + + /* the machine context */ #if defined(__EX_MCTX_MCSC__) #include /* POSIX.1 ucontext(3) */ @@ -58,17 +67,17 @@ extern int backtrace (void **__array, int __size); #define __ex_mctx_restored(mctx) /* noop */ #define __ex_mctx_restore(mctx) (void)siglongjmp((mctx)->jb, 1) -#elif defined(__EX_MCTX_SJLJ__) || !defined(__EX_MCTX_CUSTOM__) +#elif defined(__EX_MCTX_SJLJ__) || !defined(__EX_MCTX_CUSTOM__) || defined(__EX_MAYDAY) #include /* ISO-C jmp_buf(3) */ #define __ex_mctx_struct jmp_buf jb; -#define __ex_mctx_save(mctx) (setjmp((mctx)->jb) == 0) +#define __ex_mctx_save(mctx) ( MAYDAY_SAVE(mctx) setjmp((mctx)->jb) == 0) #define __ex_mctx_restored(mctx) /* noop */ -#define __ex_mctx_restore(mctx) (void)longjmp((mctx)->jb, 1) +#define __ex_mctx_restore(mctx) ( MAYDAY_RESTORE(mctx) (void)longjmp((mctx)->jb, 1)) #endif /* declare the machine context type */ typedef struct { __ex_mctx_struct } __ex_mctx_t; - + /** @addtogroup XBT_ex * @brief A set of macros providing exception a la C++ in ANSI C (grounding feature) * @@ -139,9 +148,13 @@ typedef struct { __ex_mctx_struct } __ex_mctx_t; * CATCH clauses. * - it is possible to nest TRY clauses. * - * The TRY block is a regular ISO-C language statement block, but it is not + * The TRY block is a regular ISO-C language statement block, but + * + *
it is not * allowed to jump into it via "goto" or longjmp(3) or out of it via "break", - * "return", "goto" or longjmp(3) because there is some hidden setup and + * "return", "goto" or longjmp(3).
+ * + * This is because there is some hidden setup and * cleanup that needs to be done regardless of whether an exception is * caught. Bypassing these steps will break the exception handling facility. * @@ -211,6 +224,9 @@ typedef struct { __ex_mctx_struct } __ex_mctx_t; * @{ */ +/* we need this symbol here, even if it breaks a bit the module separation */ +long int gras_os_getpid(void); + /** @brief different kind of errors */ typedef enum { unknown_error=0, /**< unknown error */ @@ -232,10 +248,11 @@ typedef struct { xbt_errcat_t category; /**< category like HTTP (what went wrong) */ int value; /**< like errno (why did it went wrong) */ /* throw point */ - short remote; /* whether it was raised remotely */ + short int remote; /* whether it was raised remotely */ char *host; /* NULL for localhost; hostname if remote */ /* FIXME: host should be hostname:port[#thread] */ char *procname; + long int pid; char *file; /**< to be freed only for remote exceptions */ int line; char *func; /**< to be freed only for remote exceptions */ @@ -255,7 +272,7 @@ typedef struct { /* the static and dynamic initializers for a context structure */ #define XBT_CTX_INITIALIZER \ { NULL, 0, { /* content */ NULL, unknown_error, 0, \ - /* throw point*/ 0,NULL, NULL, NULL, 0, NULL,\ + /* throw point*/ 0,NULL, NULL,0, NULL, 0, NULL,\ /* backtrace */ 0,NULL,{NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL} } } #define XBT_CTX_INITIALIZE(ctx) \ do { \ @@ -267,6 +284,7 @@ typedef struct { (ctx)->ctx_ex.remote = 0; \ (ctx)->ctx_ex.host = NULL; \ (ctx)->ctx_ex.procname = NULL; \ + (ctx)->ctx_ex.pid = 0; \ (ctx)->ctx_ex.file = NULL; \ (ctx)->ctx_ex.line = 0; \ (ctx)->ctx_ex.func = NULL; \ @@ -349,7 +367,7 @@ extern void __xbt_ex_terminate_default(xbt_ex_t *e); __xbt_ex_ctx_ptr->ctx_mctx = __ex_mctx_en; \ } \ if ( !(__xbt_ex_ctx()->ctx_caught) \ - || ((e) = XBT_EX_T_CPLUSPLUSCAST __xbt_ex_ctx()->ctx_ex, 0)) { \ + || ((e) = XBT_EX_T_CPLUSPLUSCAST __xbt_ex_ctx()->ctx_ex, MAYDAY_CATCH(e) 0)) { \ } \ else @@ -380,18 +398,20 @@ extern void __xbt_ex_terminate_default(xbt_ex_t *e); */ #define _THROW(c,v,m) \ - do { /* change this sequence into one block */ \ - /* build the exception */ \ - __xbt_ex_ctx()->ctx_ex.msg = (m); \ - __xbt_ex_ctx()->ctx_ex.category = (xbt_errcat_t)(c); \ - __xbt_ex_ctx()->ctx_ex.value = (v); \ - __xbt_ex_ctx()->ctx_ex.remote = 0; \ - __xbt_ex_ctx()->ctx_ex.host = (char*)NULL; \ - __xbt_ex_ctx()->ctx_ex.procname = strdup(xbt_procname()); \ - __xbt_ex_ctx()->ctx_ex.file = (char*)__FILE__; \ - __xbt_ex_ctx()->ctx_ex.line = __LINE__; \ - __xbt_ex_ctx()->ctx_ex.func = (char*)_XBT_FUNCTION; \ + do { /* change this sequence into one block */ \ + /* build the exception */ \ + __xbt_ex_ctx()->ctx_ex.msg = (m); \ + __xbt_ex_ctx()->ctx_ex.category = (xbt_errcat_t)(c); \ + __xbt_ex_ctx()->ctx_ex.value = (v); \ + __xbt_ex_ctx()->ctx_ex.remote = 0; \ + __xbt_ex_ctx()->ctx_ex.host = (char*)NULL; \ + __xbt_ex_ctx()->ctx_ex.procname = (char*)xbt_procname(); \ + __xbt_ex_ctx()->ctx_ex.pid = gras_os_getpid(); \ + __xbt_ex_ctx()->ctx_ex.file = (char*)__FILE__; \ + __xbt_ex_ctx()->ctx_ex.line = __LINE__; \ + __xbt_ex_ctx()->ctx_ex.func = (char*)_XBT_FUNCTION; \ __xbt_ex_ctx()->ctx_ex.used = backtrace((void**)__xbt_ex_ctx()->ctx_ex.bt,XBT_BACKTRACE_SIZE);\ + __xbt_ex_ctx()->ctx_ex.bt_strings = NULL; \ DO_THROW(__xbt_ex_ctx()->ctx_ex);\ } while (0) @@ -480,6 +500,7 @@ extern void __xbt_ex_terminate_default(xbt_ex_t *e); void xbt_ex_free(xbt_ex_t e); void xbt_ex_display(xbt_ex_t *e); +void xbt_backtrace_display(void); /** @} */ #endif /* __XBT_EX_H__ */