/* ex - Exception Handling */
-/* Copyright (c) 2005-2010 The SimGrid team */
+/* Copyright (c) 2005-2013. The SimGrid Team. */
/* Copyright (c) 2002-2004 Ralf S. Engelschall <rse@engelschall.com> */
/* Copyright (c) 2002-2004 The OSSP Project <http://www.ossp.org/> */
/* Copyright (c) 2002-2004 Cable & Wireless <http://www.cw.com/> */
# define MAYDAY_CATCH(e) printf("%d %s:%d Catched '%s'\n", \
xbt_getpid(), __FILE__, __LINE__, \
(e).msg \
- ),
+ ),
#else
# define MAYDAY_SAVE(m)
# define MAYDAY_RESTORE(m)
*
* Any exception thrown directly from the TRIED_BLOCK block or from called
* subroutines is caught. Cleanups which must be done after this block
- * (whenever an exception arised or not) should be placed into the optionnal
+ * (whenever an exception arose or not) should be placed into the optionnal
* CLEANUP_BLOCK. The code dealing with the exceptions when they arise should
* be placed into the (mandatory) CATCH_BLOCK.
*
* following code which shows some pitfalls and contains many errors (assuming
* a mallocex() function which throws an exception if malloc(3) fails):
*
- * \don'tinclude ex.c
+ * \dontinclude ex.c
* \skip BAD_EXAMPLE
* \until end_of_bad_example
*
/** @brief different kind of errors */
typedef enum {
- unknown_error = 0,/**< unknown error */
- arg_error, /**< Invalid argument */
- bound_error, /**< Out of bounds argument */
- mismatch_error, /**< The provided ID does not match */
- not_found_error, /**< The searched element was not found */
-
- system_error, /**< a syscall did fail */
- network_error, /**< error while sending/receiving data */
- timeout_error, /**< not quick enough, dude */
- cancel_error, /**< an action was canceled */
- thread_error, /**< error while [un]locking */
- host_error, /**< host failed */
- tracing_error, /**< error during the simulation tracing */
- io_error /**< disk or file error */
+ unknown_error = 0, /**< unknown error */
+ arg_error, /**< Invalid argument */
+ bound_error, /**< Out of bounds argument */
+ mismatch_error, /**< The provided ID does not match */
+ not_found_error, /**< The searched element was not found */
+ system_error, /**< a syscall did fail */
+ network_error, /**< error while sending/receiving data */
+ timeout_error, /**< not quick enough, dude */
+ cancel_error, /**< an action was canceled */
+ thread_error, /**< error while [un]locking */
+ host_error, /**< host failed */
+ tracing_error, /**< error during the simulation tracing */
+ io_error /**< disk or file error */
} xbt_errcat_t;
XBT_PUBLIC(const char *) xbt_ex_catname(xbt_errcat_t cat);
/** @brief Structure describing an exception */
typedef struct {
- char *msg; /**< human readable message */
- xbt_errcat_t category;
- /**< category like HTTP (what went wrong) */
- int value; /**< like errno (why did it went wrong) */
+ char *msg; /**< human readable message */
+ xbt_errcat_t category; /**< category like HTTP (what went wrong) */
+ int value; /**< like errno (why did it went wrong) */
/* throw point */
- short int remote;
- /**< whether it was raised remotely */
- char *host; /**< NULL locally thrown exceptions; full hostname if remote ones */
- /* FIXME: host should be hostname:port[#thread] */
- char *procname;
- /**< Name of the process who thrown this */
- int pid; /**< PID of the process who thrown this */
- char *file; /**< Thrown point */
- int line; /**< Thrown point */
- char *func; /**< Thrown point */
+ char *procname; /**< Name of the process who thrown this */
+ int pid; /**< PID of the process who thrown this */
+ char *file; /**< Thrown point */
+ int line; /**< Thrown point */
+ char *func; /**< Thrown point */
/* Backtrace */
int used;
char **bt_strings; /* only filed on display (or before the network propagation) */
*/
typedef struct {
__ex_mctx_t *ctx_mctx; /* permanent machine context of enclosing try/catch */
- volatile int ctx_caught; /* temporary flag whether exception was caught */
+ int ctx_caught; /* temporary flag whether exception was caught */
volatile xbt_ex_t exception; /* temporary exception storage */
} xbt_running_ctx_t;
/* the static and dynamic initializers for a context structure */
-#define XBT_RUNNING_CTX_INITIALIZER \
- { NULL, 0, { /* content */ NULL, unknown_error, 0, \
- /* throw point*/ 0,NULL, NULL,0, NULL, 0, NULL,\
+#define XBT_RUNNING_CTX_INITIALIZER \
+ { NULL, 0, { /* content */ NULL, unknown_error, 0, \
+ /* throw point*/ NULL, 0, NULL, 0, NULL, \
/* backtrace */ 0, NULL, /* bt[] */ } }
XBT_PUBLIC_DATA(const xbt_running_ctx_t) __xbt_ex_ctx_initializer;
/* the exception context */
typedef xbt_running_ctx_t *(*xbt_running_ctx_fetcher_t) (void);
XBT_PUBLIC_DATA(xbt_running_ctx_fetcher_t) __xbt_running_ctx_fetch;
-extern xbt_running_ctx_t *__xbt_ex_ctx_default(void);
+XBT_PUBLIC( xbt_running_ctx_t *)__xbt_ex_ctx_default(void);
/* the termination handler */
typedef void (*ex_term_cb_t) (xbt_ex_t *);
XBT_PUBLIC_DATA(ex_term_cb_t) __xbt_ex_terminate;
-extern void __xbt_ex_terminate_default(xbt_ex_t * e);
+XBT_PUBLIC( void )__xbt_ex_terminate_default(xbt_ex_t * e);
/** @brief Introduce a block where exception may be dealed with
* @hideinitializer
_throw_ctx->exception.msg = (m); \
_throw_ctx->exception.category = (xbt_errcat_t)(c); \
_throw_ctx->exception.value = (v); \
- _throw_ctx->exception.remote = 0; \
- _throw_ctx->exception.host = (char*)NULL; \
_throw_ctx->exception.procname = (char*)xbt_procname(); \
_throw_ctx->exception.pid = xbt_getpid(); \
_throw_ctx->exception.file = (char*)__FILE__; \
/** @brief Shows a backtrace of the current location */
XBT_PUBLIC(void) xbt_backtrace_display_current(void);
/** @brief reimplementation of glibc backtrace based directly on gcc library, without implicit malloc */
-XBT_PUBLIC(int)xbt_backtrace_no_malloc(void**bt, int size);
+XBT_PUBLIC(int) xbt_backtrace_no_malloc(void**bt, int size);
/** @brief Captures a backtrace for further use */
XBT_PUBLIC(void) xbt_backtrace_current(xbt_ex_t * e);
/** @brief Display a previously captured backtrace */
XBT_PUBLIC(void) xbt_backtrace_display(xbt_ex_t * e);
+/** @brief Get current backtrace with libunwind */
+XBT_PUBLIC(int) xbt_libunwind_backtrace(void *bt[XBT_BACKTRACE_SIZE], int size);
#ifdef XBT_USE_DEPRECATED