Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix memory leak when smpi_exit is called.
[simgrid.git] / src / smpi / internals / smpi_global.cpp
index 17b050a..719aac5 100644 (file)
@@ -4,6 +4,7 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "mc/mc.h"
+#include "simgrid/Exception.hpp"
 #include "simgrid/plugins/file_system.h"
 #include "simgrid/s4u/Engine.hpp"
 #include "smpi_coll.hpp"
@@ -12,7 +13,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"
@@ -77,8 +77,6 @@ static std::vector<std::string> privatize_libs_paths;
 // No instance gets manually created; check also the smpirun.in script as
 // this default name is used there as well (when the <actor> tag is generated).
 static const std::string smpi_default_instance_name("smpirun");
-static simgrid::config::Flag<double> smpi_init_sleep(
-  "smpi/init", "Time to inject inside a call to MPI_Init", 0.0);
 
 static simgrid::config::Flag<std::string>
     smpi_hostfile("smpi/hostfile",
@@ -320,8 +318,18 @@ static int smpi_run_entry_point(const F& entry_point, const std::string& executa
   __io_set_argv(argv);
 #elif SMPI_GFORTRAN
   _gfortran_set_args(argc, argv);
-#endif 
-  int res = entry_point(argc, argv);
+#endif
+
+  try {
+    int res = entry_point(argc, argv);
+    if (res != 0) {
+      XBT_WARN("SMPI process did not return 0. Return value : %d", res);
+      if (smpi_exit_status == 0)
+        smpi_exit_status = res;
+    }
+  } catch (simgrid::ForcefulKillException const& e) {
+    XBT_DEBUG("Caught a ForcefulKillException: %s", e.what());
+  }
 
 #if SMPI_IFORT
   for_rtl_finish_ ();
@@ -331,11 +339,6 @@ static int smpi_run_entry_point(const F& entry_point, const std::string& executa
   delete args4argv;
 #endif
 
-  if (res != 0){
-    XBT_WARN("SMPI process did not return 0. Return value : %d", res);
-    if (smpi_exit_status == 0)
-      smpi_exit_status = res;
-  }
   return 0;
 }
 
@@ -546,15 +549,12 @@ int smpi_main(const char* executable, int argc, char* argv[])
   }
 
   smpi_init_options_internal(true);
-  simgrid::instr::init();
-  SIMIX_global_init(&argc, argv);
-
-  auto engine              = simgrid::s4u::Engine::get_instance();
+  simgrid::s4u::Engine engine(&argc, argv);
 
   sg_storage_file_system_init();
   // parse the platform file: get the host list
-  engine->load_platform(argv[1]);
-  simgrid::kernel::activity::CommImpl::set_copy_data_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,12 +563,12 @@ int smpi_main(const char* executable, int argc, char* argv[])
 
   simgrid::smpi::colls::set_collectives();
   simgrid::smpi::colls::smpi_coll_cleanup_callback = nullptr;
-  
+
   SMPI_init();
 
   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);
@@ -580,7 +580,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));
@@ -633,11 +633,20 @@ void SMPI_finalize()
 
 void smpi_mpi_init() {
   smpi_init_fortran_types();
-  if(smpi_init_sleep > 0)
-    simgrid::s4u::this_actor::sleep_for(smpi_init_sleep);
+  if(_smpi_init_sleep > 0)
+    simgrid::s4u::this_actor::sleep_for(_smpi_init_sleep);
 }
 
 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();
+  THROW_IMPOSSIBLE;
+}