X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f91ee647857044925e4d8dad5953946449cb6665..68655c26de20336ad3401d9250de95c2057ea278:/src/smpi/internals/smpi_global.cpp diff --git a/src/smpi/internals/smpi_global.cpp b/src/smpi/internals/smpi_global.cpp index abcc6c0186..0fa426029b 100644 --- a/src/smpi/internals/smpi_global.cpp +++ b/src/smpi/internals/smpi_global.cpp @@ -13,6 +13,7 @@ #include "src/smpi/include/smpi_actor.hpp" #include "xbt/config.hpp" +#include #include /* DBL_MAX */ #include #include @@ -42,13 +43,14 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_kernel, smpi, "Logging specific to SMPI (ke #include #include /* 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,33 @@ typedef void (*smpi_fortran_entry_point_type)(); static int smpi_run_entry_point(smpi_entry_point_type entry_point, std::vector args) { - char noarg[] = {'\0'}; - int argc = args.size(); - std::unique_ptr 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(__INTEL_COMPILER) || defined(__ICC) - for_rtl_init_ (&argc, argvptr); -#elif defined(__GNUC__) - _gfortran_set_args(argc, argvptr); -#elif defined(__FLANG) + // copy C strings, we need them writable + std::vector args4argv(args.size()); + std::transform(begin(args), end(args), begin(args4argv), [](const std::string& s) { return xbt_strdup(s.c_str()); }); + + // take a copy of args4argv to keep reference of the allocated strings + const std::vector args2str(args4argv); + 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); + __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_ (); +#endif + for (char* s : args2str) + xbt_free(s); + if (res != 0){ XBT_WARN("SMPI process did not return 0. Return value : %d", res); if (smpi_exit_status == 0)