Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[simix] Add refcount to Process
[simgrid.git] / src / simix / smx_global.cpp
index e79e69b..7643bdd 100644 (file)
@@ -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();