Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add Dragonfly topology. Use XC30's Cray description as a basis
[simgrid.git] / src / simix / smx_global.cpp
index e79e69b..ab8d595 100644 (file)
@@ -50,10 +50,10 @@ static xbt_heap_t simix_timers = nullptr;
 /** @brief Timer datatype */
 typedef struct s_smx_timer {
   double date = 0.0;
-  std::function<void()> callback;
+  std::packaged_task<void()> callback;
 
   s_smx_timer() {}
-  s_smx_timer(double date, std::function<void()> callback)
+  s_smx_timer(double date, std::packaged_task<void()> callback)
     : date(date), callback(std::move(callback)) {}
 } s_smx_timer_t;
 
@@ -217,10 +217,6 @@ void SIMIX_global_init(int *argc, char **argv)
     // a context object with the current context mestro):
     simgrid::simix::create_maestro(maestro_code);
 
-    /* context exception handlers */
-    __xbt_running_ctx_fetch = &SIMIX_process_get_running_context;
-    __xbt_ex_terminate = &SIMIX_process_exception_terminate;
-
     /* Prepare to display some more info when dying on Ctrl-C pressing */
     signal(SIGINT, inthandler);
 
@@ -268,6 +264,18 @@ int smx_cleaned = 0;
 void SIMIX_clean(void)
 {
   if (smx_cleaned) return; // to avoid double cleaning by java and C
+
+#if HAVE_SMPI
+  if (SIMIX_process_count()>0){
+    if(smpi_process_initialized()){
+      xbt_die("Process exited without calling MPI_Finalize - Killing simulation");
+    }else{
+      XBT_WARN("Process called exit when leaving - Skipping cleanups");
+      return;
+    }
+  }
+#endif
+
   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) {
@@ -299,15 +307,9 @@ void SIMIX_clean(void)
   /* Let's free maestro now */
   delete simix_global->maestro_process->context;
   simix_global->maestro_process->context = nullptr;
-  xbt_free(simix_global->maestro_process->running_ctx);
-  simix_global->maestro_process->running_ctx = nullptr;
   delete simix_global->maestro_process;
   simix_global->maestro_process = nullptr;
 
-  /* Restore the default exception setup */
-  __xbt_running_ctx_fetch = &__xbt_ex_ctx_default;
-  __xbt_ex_terminate = &__xbt_ex_terminate_default;
-
   /* Finish context module and SURF */
   SIMIX_context_mod_exit();
 
@@ -472,13 +474,11 @@ void SIMIX_run(void)
        //FIXME: make the timers being real callbacks
        // (i.e. provide dispatchers that read and expand the args)
        timer = (smx_timer_t) xbt_heap_pop(simix_timers);
-       if (timer->callback) {
-         try {
-           timer->callback();
-         }
-         catch(...) {
-           xbt_die("Exception throwed ouf of timer callback");
-         }
+       try {
+         timer->callback();
+       }
+       catch(...) {
+         xbt_die("Exception throwed ouf of timer callback");
        }
        delete timer;
     }
@@ -537,12 +537,13 @@ void SIMIX_run(void)
  */
 smx_timer_t SIMIX_timer_set(double date, void (*function)(void*), void *arg)
 {
-  smx_timer_t timer = new s_smx_timer_t(date, std::bind(function, arg));
+  smx_timer_t timer = new s_smx_timer_t(date,
+    std::packaged_task<void()>(std::bind(function, arg)));
   xbt_heap_push(simix_timers, timer, date);
   return timer;
 }
 
-smx_timer_t SIMIX_timer_set(double date, std::function<void()> callback)
+smx_timer_t SIMIX_timer_set(double date, std::packaged_task<void()> callback)
 {
   smx_timer_t timer = new s_smx_timer_t(date, std::move(callback));
   xbt_heap_push(simix_timers, timer, date);