Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
don't fail miserably when raising an exception after simulation shutdown
authorMartin Quinson <martin.quinson@loria.fr>
Thu, 24 Sep 2015 20:23:26 +0000 (22:23 +0200)
committerMartin Quinson <martin.quinson@loria.fr>
Thu, 24 Sep 2015 20:23:29 +0000 (22:23 +0200)
Fix #26

include/xbt/module.h
src/simix/smx_global.c
src/xbt/ex.c
src/xbt/xbt_main.c

index 9405484..1e2affa 100644 (file)
@@ -15,6 +15,8 @@ SG_BEGIN_DECL()
 
 XBT_PUBLIC(void) xbt_init(int *argc, char **argv);
 XBT_PUBLIC(void) xbt_exit(void);
 
 XBT_PUBLIC(void) xbt_init(int *argc, char **argv);
 XBT_PUBLIC(void) xbt_exit(void);
+XBT_PUBLIC_DATA(int) smx_cleaned;
+XBT_PUBLIC_DATA(int) xbt_initialized;
 
 SG_END_DECL()
 
 
 SG_END_DECL()
 
index bd87629..d3337a3 100644 (file)
@@ -238,6 +238,7 @@ void SIMIX_global_init(int *argc, char **argv)
     exit(0);
 }
 
     exit(0);
 }
 
+int smx_cleaned = 0;
 /**
  * \ingroup SIMIX_API
  * \brief Clean the SIMIX simulation
 /**
  * \ingroup SIMIX_API
  * \brief Clean the SIMIX simulation
@@ -246,12 +247,11 @@ void SIMIX_global_init(int *argc, char **argv)
  */
 void SIMIX_clean(void)
 {
  */
 void SIMIX_clean(void)
 {
-  static int cleaned = 0;
 #ifdef TIME_BENCH_PER_SR
   smx_ctx_raw_new_sr();
 #endif
 #ifdef TIME_BENCH_PER_SR
   smx_ctx_raw_new_sr();
 #endif
-  if (cleaned) return; // to avoid double cleaning by java and C
-  cleaned = 1;
+  if (smx_cleaned) return; // to avoid double cleaning by java and C
+  smx_cleaned = 1;
   XBT_DEBUG("SIMIX_clean called. Simulation's over.");
   if (!xbt_dynar_is_empty(simix_global->process_to_run) && SIMIX_get_clock() == 0.0) {
          XBT_CRITICAL("   ");
   XBT_DEBUG("SIMIX_clean called. Simulation's over.");
   if (!xbt_dynar_is_empty(simix_global->process_to_run) && SIMIX_get_clock() == 0.0) {
          XBT_CRITICAL("   ");
index e6bbedb..a54869f 100644 (file)
@@ -148,6 +148,11 @@ void xbt_ex_display(xbt_ex_t * e)
   XBT_CRITICAL("%s", e->msg);
   xbt_free(thrower);
 
   XBT_CRITICAL("%s", e->msg);
   xbt_free(thrower);
 
+  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);
 
   if (!e->bt_strings)
     xbt_ex_setup_backtrace(e);
 
index 4923f24..e1a234f 100644 (file)
@@ -124,6 +124,7 @@ static void xbt_preinit(void) {
 static void xbt_postexit(void)
 {
   if(!_sg_do_clean_atexit) return;
 static void xbt_postexit(void)
 {
   if(!_sg_do_clean_atexit) return;
+  xbt_initialized--;
   xbt_backtrace_postexit();
   xbt_fifo_postexit();
   xbt_dict_postexit();
   xbt_backtrace_postexit();
   xbt_fifo_postexit();
   xbt_dict_postexit();