Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Added parameters to indicate flow id, so unique flows use a reliable msg_task_send...
[simgrid.git] / include / xbt / ex.h
index 5c9a0c5..5763ec9 100644 (file)
 #include "xbt/misc.h"
 #include "xbt/virtu.h"
 
-/* do not include execinfo.h directly since it's not always available. 
-   Instead, copy the parts we need (and fake when it's not there) */
-XBT_PUBLIC(int) backtrace (void **__array, int __size);
-
-
 /*-*-* Emergency debuging: define this when the exceptions get crazy *-*-*/
 #undef __EX_MAYDAY
 
@@ -307,12 +302,12 @@ typedef struct {
 
 /* the exception context */
 typedef ex_ctx_t *(*ex_ctx_cb_t)(void);
-extern XBT_PUBLIC_DATA(ex_ctx_cb_t) __xbt_ex_ctx;
+XBT_PUBLIC_DATA(ex_ctx_cb_t) __xbt_ex_ctx;
 extern ex_ctx_t *__xbt_ex_ctx_default(void);
 
 /* the termination handler */
 typedef void (*ex_term_cb_t)(xbt_ex_t *);
-extern XBT_PUBLIC_DATA(ex_term_cb_t) __xbt_ex_terminate;
+XBT_PUBLIC_DATA(ex_term_cb_t) __xbt_ex_terminate;
 extern void __xbt_ex_terminate_default(xbt_ex_t *e);
 
 /** @brief Introduce a block where exception may be dealed with 
@@ -401,22 +396,24 @@ 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 = (char*)xbt_procname();                 \
-     __xbt_ex_ctx()->ctx_ex.pid      = (*xbt_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);\
+  do { /* change this sequence into one block */                          \
+     ex_ctx_t *_throw_ctx = __xbt_ex_ctx();                               \
+     /* build the exception */                                            \
+     _throw_ctx->ctx_ex.msg      = (m);                                   \
+     _throw_ctx->ctx_ex.category = (xbt_errcat_t)(c);                     \
+     _throw_ctx->ctx_ex.value    = (v);                                   \
+     _throw_ctx->ctx_ex.remote   = 0;                                     \
+     _throw_ctx->ctx_ex.host     = (char*)NULL;                           \
+     _throw_ctx->ctx_ex.procname = (char*)xbt_procname();                 \
+     _throw_ctx->ctx_ex.pid      = (*xbt_getpid)();                       \
+     _throw_ctx->ctx_ex.file     = (char*)__FILE__;                       \
+     _throw_ctx->ctx_ex.line     = __LINE__;                              \
+     _throw_ctx->ctx_ex.func     = (char*)_XBT_FUNCTION;                  \
+     _throw_ctx->ctx_ex.bt_strings = NULL;                                \
+     xbt_backtrace_current( (xbt_ex_t *) &(_throw_ctx->ctx_ex) );         \
+     DO_THROW(_throw_ctx->ctx_ex);                                        \
   } while (0)
+//     __xbt_ex_ctx()->ctx_ex.used     = backtrace((void**)__xbt_ex_ctx()->ctx_ex.bt,XBT_BACKTRACE_SIZE);
 
 /** @brief Builds and throws an exception with a string taking no arguments
     @hideinitializer */
@@ -505,8 +502,12 @@ extern void __xbt_ex_terminate_default(xbt_ex_t *e);
 /** @brief Exception destructor */
 XBT_PUBLIC(void) xbt_ex_free(xbt_ex_t e);
 
-XBT_PUBLIC(void) xbt_ex_display(xbt_ex_t *e);
-XBT_PUBLIC(void) xbt_backtrace_display(void);
+/** @brief Shows a backtrace of the current location */
+XBT_PUBLIC(void) xbt_backtrace_display_current(void);
+/** @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);
 
 /** @} */
 #endif /* __XBT_EX_H__ */