X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8a5f524d0dd2346b153dc63231643278261b79e7..937f2eb5b429c3c03fc989a25fbc26fabd0cf529:/src/smpi/internals/smpi_global.cpp diff --git a/src/smpi/internals/smpi_global.cpp b/src/smpi/internals/smpi_global.cpp index 66a4be23ca..bd0b4e022a 100644 --- a/src/smpi/internals/smpi_global.cpp +++ b/src/smpi/internals/smpi_global.cpp @@ -44,6 +44,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_kernel, smpi, "Logging specific to SMPI (ke #if SMPI_IFORT extern "C" void for_rtl_init_ (int *, char **); + extern "C" void for_rtl_finish_ (); #elif SMPI_FLANG extern "C" void __io_set_argc(int); extern "C" void __io_set_argv(char **); @@ -425,23 +426,37 @@ 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]); + int argc_saved = args.size(); + int argc=argc_saved; + char** argv = new char*[argc + 1]; for (int i = 0; i != argc; ++i) - argv[i] = args[i].empty() ? noarg : &args[i].front(); + argv[i] = xbt_strdup(args[i].c_str()); argv[argc] = nullptr; - char ** argvptr=argv.get(); - simgrid::smpi::ActorExt::init(&argc, &argvptr); + char* name = argv[0]; + char* instance = argv[1]; + simgrid::smpi::ActorExt::init(&argc, &argv); #if SMPI_IFORT - for_rtl_init_ (&argc, argvptr); + 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, argvptr); + _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 (int i = 0; i != argc; ++i) + xbt_free(argv[i]); + if (argc_saved > 3) { + xbt_free(instance); + xbt_free(name); + } + delete[] argv; +#endif + if (res != 0){ XBT_WARN("SMPI process did not return 0. Return value : %d", res); if (smpi_exit_status == 0)