X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d3d89a6101c2a911d9f2a3b02ca928fcab8b1a57..098b6beb025164bc7226f11ccf32ee5b3fa9fbb2:/src/smpi/internals/smpi_global.cpp diff --git a/src/smpi/internals/smpi_global.cpp b/src/smpi/internals/smpi_global.cpp index 2285daf38f..0c5d88a847 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 @@ -94,7 +95,7 @@ MPI_Errhandler *MPI_ERRHANDLER_NULL = nullptr; // No instance gets manually created; check also the smpirun.in script as // this default name is used there as well (when the tag is generated). static const std::string smpi_default_instance_name("smpirun"); -static simgrid::config::Flag smpi_wtime_sleep( +XBT_PRIVATE simgrid::config::Flag smpi_wtime_sleep( "smpi/wtime", "Minimum time to inject inside a call to MPI_Wtime", 0.0); static simgrid::config::Flag smpi_init_sleep( "smpi/init", "Time to inject inside a call to MPI_Init", 0.0); @@ -426,16 +427,18 @@ typedef void (*smpi_fortran_entry_point_type)(); static int smpi_run_entry_point(smpi_entry_point_type entry_point, std::vector args) { - int argc_saved = args.size(); - int argc=argc_saved; - char** argv = new char*[argc + 1]; - for (int i = 0; i != argc; ++i) - argv[i] = xbt_strdup(args[i].c_str()); - argv[argc] = nullptr; + // copy C strings, we need them writable + std::vector* args4argv = new std::vector(args.size()); + std::transform(begin(args), end(args), begin(*args4argv), [](const std::string& s) { return xbt_strdup(s.c_str()); }); + #if !SMPI_IFORT - char* name = argv[0]; - char* instance = argv[1]; + // take a copy of args4argv to keep reference of the allocated strings + const std::vector 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); @@ -450,13 +453,9 @@ static int smpi_run_entry_point(smpi_entry_point_type entry_point, std::vector 3) { - xbt_free(instance); - xbt_free(name); - } - delete[] argv; + for (char* s : args2str) + xbt_free(s); + delete args4argv; #endif if (res != 0){