Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Mark the smpi_exit call as noreturn, and really kill the process when exit is called
[simgrid.git] / src / smpi / internals / smpi_global.cpp
index 6f6056b..65453e4 100644 (file)
@@ -12,7 +12,6 @@
 #include "smpi_host.hpp"
 #include "src/kernel/EngineImpl.hpp"
 #include "src/kernel/activity/CommImpl.hpp"
-#include "src/simix/smx_private.hpp"
 #include "src/smpi/include/smpi_actor.hpp"
 #include "xbt/config.hpp"
 #include "xbt/file.hpp"
@@ -544,12 +543,12 @@ int smpi_main(const char* executable, int argc, char* argv[])
   }
 
   smpi_init_options_internal(true);
-  auto engine = simgrid::s4u::Engine::get_instance(&argc, argv);
+  simgrid::s4u::Engine engine(&argc, argv);
 
   sg_storage_file_system_init();
   // parse the platform file: get the host list
-  engine->load_platform(argv[1]);
-  engine->set_default_comm_data_copy_callback(smpi_comm_copy_buffer_callback);
+  engine.load_platform(argv[1]);
+  engine.set_default_comm_data_copy_callback(smpi_comm_copy_buffer_callback);
 
   if (smpi_cfg_privatization() == SmpiPrivStrategies::DLOPEN)
     smpi_init_privatization_dlopen(executable);
@@ -563,7 +562,7 @@ int smpi_main(const char* executable, int argc, char* argv[])
 
   const std::vector<const char*> args(argv + 2, argv + argc);
   int rank_counts =
-      smpi_deployment_smpirun(engine, smpi_hostfile.get(), smpi_np.get(), smpi_replay.get(), smpi_map.get(), args);
+      smpi_deployment_smpirun(&engine, smpi_hostfile.get(), smpi_np.get(), smpi_replay.get(), smpi_map.get(), args);
 
   SMPI_app_instance_register(smpi_default_instance_name.c_str(), nullptr, rank_counts);
   MPI_COMM_WORLD = *smpi_deployment_comm_world(smpi_default_instance_name);
@@ -575,7 +574,7 @@ int smpi_main(const char* executable, int argc, char* argv[])
   if (MC_is_active()) {
     MC_run();
   } else {
-    simgrid::kernel::EngineImpl::get_instance()->run();
+    engine.get_impl()->run();
 
     xbt_os_walltimer_stop(global_timer);
     simgrid::smpi::utils::print_time_analysis(xbt_os_timer_elapsed(global_timer));
@@ -636,3 +635,12 @@ void SMPI_thread_create() {
   TRACE_smpi_init(simgrid::s4u::this_actor::get_pid(), __func__);
   smpi_process()->mark_as_initialized();
 }
+
+void smpi_exit(int res){
+  if(res != 0){
+    XBT_WARN("SMPI process did not return 0. Return value : %d", res);
+    smpi_exit_status = res;
+  }
+  simgrid::s4u::this_actor::exit();
+  while(1);//necessary for the noreturn attribute
+}