X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/819942b4ca0be7a019133420d20004abf80de221..4d9809aa64447811ca65a1242d4f9e07972c6472:/src/smpi/internals/smpi_global.cpp diff --git a/src/smpi/internals/smpi_global.cpp b/src/smpi/internals/smpi_global.cpp index f63b4d9095..dcc7d0fed2 100644 --- a/src/smpi/internals/smpi_global.cpp +++ b/src/smpi/internals/smpi_global.cpp @@ -31,7 +31,7 @@ # define MAC_OS_X_VERSION_10_12 101200 # endif # define HAVE_WORKING_MMAP (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12) -#elif defined(__FreeBSD__) +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) # define HAVE_WORKING_MMAP 0 #else # define HAVE_WORKING_MMAP 1 @@ -129,7 +129,7 @@ MPI_Comm smpi_process_comm_self(){ } void smpi_process_init(int *argc, char ***argv){ - simgrid::smpi::ActorExt::init(argc, argv); + simgrid::smpi::ActorExt::init(); } void * smpi_process_get_user_data(){ @@ -423,12 +423,17 @@ typedef std::function smpi_entry_point_type; typedef int (* smpi_c_entry_point_type)(int argc, char **argv); typedef void (*smpi_fortran_entry_point_type)(); -static int smpi_run_entry_point(smpi_entry_point_type entry_point, std::vector args) +static int smpi_run_entry_point(smpi_entry_point_type entry_point, const std::string& executable_path, + std::vector args) { // 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()); }); + // set argv[0] to executable_path + xbt_free((*args4argv)[0]); + (*args4argv)[0] = xbt_strdup(executable_path.c_str()); + #if !SMPI_IFORT // take a copy of args4argv to keep reference of the allocated strings const std::vector args2str(*args4argv); @@ -437,7 +442,7 @@ static int smpi_run_entry_point(smpi_entry_point_type entry_point, std::vectorpush_back(nullptr); char** argv = args4argv->data(); - simgrid::smpi::ActorExt::init(&argc, &argv); + simgrid::smpi::ActorExt::init(); #if SMPI_IFORT for_rtl_init_ (&argc, argv); #elif SMPI_FLANG @@ -492,31 +497,35 @@ static void smpi_copy_file(std::string src, std::string target, off_t fdin_size) xbt_assert(fdout >= 0, "Cannot write into %s", target.c_str()); XBT_DEBUG("Copy %" PRIdMAX " bytes into %s", static_cast(fdin_size), target.c_str()); + bool slow_copy = true; #if HAVE_SENDFILE ssize_t sent_size = sendfile(fdout, fdin, NULL, fdin_size); - xbt_assert(sent_size == fdin_size, - "Error while copying %s: only %zd bytes copied instead of %" PRIdMAX " (errno: %d -- %s)", target.c_str(), - sent_size, static_cast(fdin_size), errno, strerror(errno)); -#else - const int bufsize = 1024 * 1024 * 4; - char buf[bufsize]; - while (int got = read(fdin, buf, bufsize)) { - if (got == -1) { - xbt_assert(errno == EINTR, "Cannot read from %s", src.c_str()); - } else { - char* p = buf; - int todo = got; - while (int done = write(fdout, p, todo)) { - if (done == -1) { - xbt_assert(errno == EINTR, "Cannot write into %s", target.c_str()); - } else { - p += done; - todo -= done; + if (sent_size == fdin_size) + slow_copy = false; + else if (sent_size != -1 || errno != ENOSYS) + xbt_die("Error while copying %s: only %zd bytes copied instead of %" PRIdMAX " (errno: %d -- %s)", target.c_str(), + sent_size, static_cast(fdin_size), errno, strerror(errno)); +#endif + if (slow_copy) { + const int bufsize = 1024 * 1024 * 4; + char buf[bufsize]; + while (int got = read(fdin, buf, bufsize)) { + if (got == -1) { + xbt_assert(errno == EINTR, "Cannot read from %s", src.c_str()); + } else { + char* p = buf; + int todo = got; + while (int done = write(fdout, p, todo)) { + if (done == -1) { + xbt_assert(errno == EINTR, "Cannot write into %s", target.c_str()); + } else { + p += done; + todo -= done; + } } } } } -#endif close(fdin); close(fdout); } @@ -535,7 +544,7 @@ static int visit_libs(struct dl_phdr_info* info, size_t, void* data) } #endif -static void smpi_init_privatization_dlopen(std::string executable) +static void smpi_init_privatization_dlopen(const std::string& executable) { // Prepare the copy of the binary (get its size) struct stat fdin_stat; @@ -571,7 +580,6 @@ static void smpi_init_privatization_dlopen(std::string executable) simix_global->default_function = [executable, fdin_size](std::vector args) { return std::function([executable, fdin_size, args] { - // Copy the dynamic library: std::string target_executable = executable + "_" + std::to_string(getpid()) + "_" + std::to_string(rank) + ".so"; @@ -624,12 +632,12 @@ static void smpi_init_privatization_dlopen(std::string executable) smpi_entry_point_type entry_point = smpi_resolve_function(handle); if (not entry_point) xbt_die("Could not resolve entry point"); - smpi_run_entry_point(entry_point, args); + smpi_run_entry_point(entry_point, executable, args); }); }; } -static void smpi_init_privatization_no_dlopen(std::string executable) +static void smpi_init_privatization_no_dlopen(const std::string& executable) { if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) smpi_prepare_global_memory_segment(); @@ -644,8 +652,9 @@ static void smpi_init_privatization_no_dlopen(std::string executable) smpi_backup_global_memory_segment(); // Execute the same entry point for each simulated process: - simix_global->default_function = [entry_point](std::vector args) { - return std::function([entry_point, args] { smpi_run_entry_point(entry_point, args); }); + simix_global->default_function = [entry_point, executable](std::vector args) { + return std::function( + [entry_point, executable, args] { smpi_run_entry_point(entry_point, executable, args); }); }; }