Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Mark some internal symbols as hidden on ELF in xbt
[simgrid.git] / src / xbt / ex.c
index bdb3aa2..a54869f 100644 (file)
@@ -1,6 +1,8 @@
 /* ex - Exception Handling                                                  */
 
 /* ex - Exception Handling                                                  */
 
-/*  Copyright (c) 2005-2010 The SimGrid team                                */
+/* Copyright (c) 2005-2015. The SimGrid Team.
+ * All rights reserved.                                                     */
+
 /*  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/>           */
 /*  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/>           */
 #include "portable.h"           /* execinfo when available */
 #include "xbt/ex.h"
 #include "xbt/str.h"
 #include "portable.h"           /* execinfo when available */
 #include "xbt/ex.h"
 #include "xbt/str.h"
-#include "xbt/module.h"         /* xbt_binary_name */
+#include "xbt/synchro_core.h"
 #include "xbt_modinter.h"       /* backtrace initialization headers */
 #include "xbt_modinter.h"       /* backtrace initialization headers */
-#include "xbt/synchro.h"        /* xbt_thread_self */
 
 
-#include "gras/Virtu/virtu_interface.h" /* gras_os_myname */
 #include "xbt/ex_interface.h"
 #include "xbt/ex_interface.h"
+#include "simgrid/sg_config.h"  /* Configuration mechanism of SimGrid */
+
 
 #undef HAVE_BACKTRACE
 #if defined(HAVE_EXECINFO_H) && defined(HAVE_POPEN) && defined(ADDR2LINE)
 
 #undef HAVE_BACKTRACE
 #if defined(HAVE_EXECINFO_H) && defined(HAVE_POPEN) && defined(ADDR2LINE)
@@ -77,7 +79,7 @@ xbt_running_ctx_t *__xbt_ex_ctx_default(void)
      real life and in simulation when using threads to implement the simulation
      processes (ie, with pthreads and on windows).
 
      real life and in simulation when using threads to implement the simulation
      processes (ie, with pthreads and on windows).
 
-     It also gets overriden in xbt/context.c when using ucontextes (as well as
+     It also gets overriden in xbt/context.c when using ucontexts (as well as
      in Java for now, but after the java overhaul, it will get cleaned out)
    */
   static xbt_running_ctx_t ctx = XBT_RUNNING_CTX_INITIALIZER;
      in Java for now, but after the java overhaul, it will get cleaned out)
    */
   static xbt_running_ctx_t ctx = XBT_RUNNING_CTX_INITIALIZER;
@@ -106,7 +108,6 @@ void xbt_backtrace_display(xbt_ex_t * e)
 
   /* don't fool xbt_ex_free with uninitialized msg field */
   e->msg = NULL;
 
   /* don't fool xbt_ex_free with uninitialized msg field */
   e->msg = NULL;
-  e->remote = 0;
   xbt_ex_free(*e);
 #else
 
   xbt_ex_free(*e);
 #else
 
@@ -134,21 +135,25 @@ void xbt_backtrace_display_current(void)
 void xbt_ex_display(xbt_ex_t * e)
 {
   char *thrower = NULL;
 void xbt_ex_display(xbt_ex_t * e)
 {
   char *thrower = NULL;
-
-  if (e->remote)
-    thrower = bprintf(" on host %s(%d)", e->host, e->pid);
+  if (e->pid != xbt_getpid())
+    thrower = bprintf(" on process %d",e->pid);
 
   fprintf(stderr,
           "** SimGrid: UNCAUGHT EXCEPTION received on %s(%d): category: %s; value: %d\n"
           "** %s\n"
           "** Thrown by %s()%s\n",
 
   fprintf(stderr,
           "** SimGrid: UNCAUGHT EXCEPTION received on %s(%d): category: %s; value: %d\n"
           "** %s\n"
           "** Thrown by %s()%s\n",
-          gras_os_myname(), xbt_getpid(),
+          xbt_binary_name, xbt_getpid(),
           xbt_ex_catname(e->category), e->value, e->msg,
           e->procname, thrower ? thrower : " in this process");
   XBT_CRITICAL("%s", e->msg);
   xbt_free(thrower);
 
           xbt_ex_catname(e->category), e->value, e->msg,
           e->procname, thrower ? thrower : " in this process");
   XBT_CRITICAL("%s", e->msg);
   xbt_free(thrower);
 
-  if (!e->remote && !e->bt_strings)
+  if (xbt_initialized==0 || smx_cleaned) {
+         fprintf(stderr, "Ouch. SimGrid is not initialized yet, or already closing. No backtrace available.\n");
+         return; /* Not started yet or already closing. Trying to generate a backtrace would probably fail */
+  }
+
+  if (!e->bt_strings)
     xbt_ex_setup_backtrace(e);
 
 #ifdef HAVE_BACKTRACE
     xbt_ex_setup_backtrace(e);
 
 #ifdef HAVE_BACKTRACE
@@ -157,8 +162,27 @@ void xbt_ex_display(xbt_ex_t * e)
     int i;
 
     fprintf(stderr, "\n");
     int i;
 
     fprintf(stderr, "\n");
-    for (i = 0; i < e->used; i++)
-      fprintf(stderr, "%s\n", e->bt_strings[i]);
+    for (i = 0; i < e->used; i++) {
+      if (sg_cfg_get_boolean("exception/cutpath")) {
+        char* p = e->bt_strings[i];
+        xbt_str_rtrim(p, ":0123456789");
+        char* filename = strrchr(p, '/')+1;
+        char* end_of_message  = strrchr(p, ' ');
+
+        int length = strlen(p)-strlen(end_of_message);
+        char* dest = malloc(length);
+
+        memcpy(dest, &p[0], length);
+        dest[length] = 0;
+
+        fprintf(stderr, "%s %s\n", dest, filename);
+
+        free(dest);
+      }
+      else {
+        fprintf(stderr, "%s\n", e->bt_strings[i]);
+      }
+    }
 
   } else
 #endif
 
   } else
 #endif
@@ -176,14 +200,12 @@ void xbt_ex_display(xbt_ex_t * e)
 void __xbt_ex_terminate_default(xbt_ex_t * e)
 {
   xbt_ex_display(e);
 void __xbt_ex_terminate_default(xbt_ex_t * e)
 {
   xbt_ex_display(e);
-
-  abort();
+  xbt_abort();
 }
 
 /* the externally visible API */
 XBT_EXPORT_NO_IMPORT(xbt_running_ctx_fetcher_t) __xbt_running_ctx_fetch = &__xbt_ex_ctx_default;
 }
 
 /* the externally visible API */
 XBT_EXPORT_NO_IMPORT(xbt_running_ctx_fetcher_t) __xbt_running_ctx_fetch = &__xbt_ex_ctx_default;
-XBT_EXPORT_NO_IMPORT(ex_term_cb_t) __xbt_ex_terminate =
-    &__xbt_ex_terminate_default;
+XBT_EXPORT_NO_IMPORT(ex_term_cb_t) __xbt_ex_terminate = &__xbt_ex_terminate_default;
 
 
 void xbt_ex_free(xbt_ex_t e)
 
 
 void xbt_ex_free(xbt_ex_t e)
@@ -191,12 +213,6 @@ void xbt_ex_free(xbt_ex_t e)
   int i;
 
   free(e.msg);
   int i;
 
   free(e.msg);
-  if (e.remote) {
-    free(e.procname);
-    free(e.file);
-    free(e.func);
-    free(e.host);
-  }
 
   if (e.bt_strings) {
     for (i = 0; i < e.used; i++)
 
   if (e.bt_strings) {
     for (i = 0; i < e.used; i++)
@@ -211,24 +227,36 @@ const char *xbt_ex_catname(xbt_errcat_t cat)
 {
   switch (cat) {
   case unknown_error:
 {
   switch (cat) {
   case unknown_error:
-    return "unknown_err";
+    return "unknown error";
   case arg_error:
   case arg_error:
-    return "invalid_arg";
+    return "invalid argument";
+  case bound_error:
+    return "out of bounds";
   case mismatch_error:
     return "mismatch";
   case not_found_error:
     return "not found";
   case system_error:
   case mismatch_error:
     return "mismatch";
   case not_found_error:
     return "not found";
   case system_error:
-    return "system_err";
+    return "system error";
   case network_error:
   case network_error:
-    return "network_err";
+    return "network error";
   case timeout_error:
     return "timeout";
   case timeout_error:
     return "timeout";
+  case cancel_error:
+    return "action canceled";
   case thread_error:
   case thread_error:
-    return "thread_err";
-  default:
-    return "INVALID_ERR";
+    return "thread error";
+  case host_error:
+    return "host failed";
+  case tracing_error:
+    return "tracing error";
+  case io_error:
+    return "io error";
+  case vm_error:
+    return "vm error";
+
   }
   }
+  return "INVALID ERROR";
 }
 
 
 }
 
 
@@ -297,7 +325,7 @@ XBT_TEST_UNIT("value", test_value, "exception value passing")
   CATCH(ex) {
     xbt_test_add("exception value passing");
     if (ex.category != unknown_error)
   CATCH(ex) {
     xbt_test_add("exception value passing");
     if (ex.category != unknown_error)
-      xbt_test_fail("category=%d (!= 1)", ex.category);
+      xbt_test_fail("category=%d (!= 1)", (int)ex.category);
     if (ex.value != 2)
       xbt_test_fail("value=%d (!= 2)", ex.value);
     if (strcmp(ex.msg, "toto"))
     if (ex.value != 2)
       xbt_test_fail("value=%d (!= 2)", ex.value);
     if (strcmp(ex.msg, "toto"))
@@ -310,8 +338,9 @@ XBT_TEST_UNIT("variables", test_variables, "variable value preservation")
 {
   xbt_ex_t ex;
   int r1;
 {
   xbt_ex_t ex;
   int r1;
-  int _XBT_GNUC_UNUSED r2;
-  volatile int v1, v2;
+  int XBT_ATTRIB_UNUSED r2;
+  int v1;
+  volatile int v2;
 
   r1 = r2 = v1 = v2 = 1234;
   TRY {
 
   r1 = r2 = v1 = v2 = 1234;
   TRY {
@@ -413,7 +442,7 @@ typedef struct {
 
 static void good_example(void)
 {
 
 static void good_example(void)
 {
-  global_context_t *global_context = malloc(sizeof(global_context_t));
+  global_context_t *global_context = xbt_malloc(sizeof(global_context_t));
 
   /* GOOD_EXAMPLE */
   {                             /*01 */
 
   /* GOOD_EXAMPLE */
   {                             /*01 */