Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Variable may be unused.
[simgrid.git] / src / smpi / internals / smpi_global.cpp
index 5f63d1a..e75aef9 100644 (file)
@@ -13,6 +13,7 @@
 #include "src/smpi/include/smpi_actor.hpp"
 #include "xbt/config.hpp"
 
+#include <algorithm>
 #include <cfloat> /* DBL_MAX */
 #include <dlfcn.h>
 #include <fcntl.h>
@@ -42,13 +43,14 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_kernel, smpi, "Logging specific to SMPI (ke
 #include <boost/tokenizer.hpp>
 #include <boost/algorithm/string.hpp> /* trim_right / trim_left */
 
-#if defined(__INTEL_COMPILER) || defined(__ICC)
+#if SMPI_IFORT
   extern "C" void for_rtl_init_ (int *, char **);
-#elif defined(__GNUC__)
-  extern "C" void _gfortran_set_args(int, char **);
-#elif defined(__FLANG)
+  extern "C" void for_rtl_finish_ ();
+#elif SMPI_FLANG
   extern "C" void __io_set_argc(int);
   extern "C" void __io_set_argv(char **);
+#elif SMPI_GFORTRAN
+  extern "C" void _gfortran_set_args(int, char **);
 #endif
 
 #ifndef RTLD_DEEPBIND
@@ -425,23 +427,37 @@ typedef void (*smpi_fortran_entry_point_type)();
 
 static int smpi_run_entry_point(smpi_entry_point_type entry_point, std::vector<std::string> args)
 {
-  char noarg[]   = {'\0'};
-  int argc = args.size();
-  std::unique_ptr<char*[]> argv(new char*[argc + 1]);
-  for (int i = 0; i != argc; ++i)
-    argv[i] = args[i].empty() ? noarg : &args[i].front();
-  argv[argc] = nullptr;
-  char ** argvptr=argv.get();
-  simgrid::smpi::ActorExt::init(&argc, &argvptr);
-#if defined(__GNUC__)
-  _gfortran_set_args(argc, argvptr);
-#elif defined(__FLANG)
+  // copy C strings, we need them writable
+  std::vector<char*>* args4argv = new std::vector<char*>(args.size());
+  std::transform(begin(args), end(args), begin(*args4argv), [](const std::string& s) { return xbt_strdup(s.c_str()); });
+
+#if !SMPI_IFORT
+  // take a copy of args4argv to keep reference of the allocated strings
+  const std::vector<char*> args2str(*args4argv);
+#endif
+  int argc = args4argv->size();
+  args4argv->push_back(nullptr);
+  char** argv = args4argv->data();
+
+  simgrid::smpi::ActorExt::init(&argc, &argv);
+#if SMPI_IFORT
+  for_rtl_init_ (&argc, argv);
+#elif SMPI_FLANG
   __io_set_argc(argc);
-  __io_set_argv(argvptr);
-#elif defined(__INTEL_COMPILER) || defined(__ICC)
-  for_rtl_init_ (&argc, argvptr);
+  __io_set_argv(argv);
+#elif SMPI_GFORTRAN
+  _gfortran_set_args(argc, argv);
 #endif 
-  int res = entry_point(argc, argvptr);
+  int res = entry_point(argc, argv);
+
+#if SMPI_IFORT
+  for_rtl_finish_ ();
+#else
+  for (char* s : args2str)
+    xbt_free(s);
+  delete args4argv;
+#endif
+
   if (res != 0){
     XBT_WARN("SMPI process did not return 0. Return value : %d", res);
     if (smpi_exit_status == 0)