-/* Copyright (c) 2007-2018. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2007-2019. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
# define HAVE_WORKING_MMAP 1
#endif
-#if HAVE_SENDFILE
+#if SG_HAVE_SENDFILE
#include <sys/sendfile.h>
#endif
}
void smpi_process_init(int *argc, char ***argv){
- simgrid::smpi::ActorExt::init(argc, argv);
+ simgrid::smpi::ActorExt::init();
}
void * smpi_process_get_user_data(){
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<std::string> args)
+static int smpi_run_entry_point(smpi_entry_point_type entry_point, const std::string& executable_path,
+ std::vector<std::string> args)
{
// 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()); });
+ // 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<char*> args2str(*args4argv);
args4argv->push_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
XBT_DEBUG("Copy %" PRIdMAX " bytes into %s", static_cast<intmax_t>(fdin_size), target.c_str());
bool slow_copy = true;
-#if HAVE_SENDFILE
+#if SG_HAVE_SENDFILE
ssize_t sent_size = sendfile(fdout, fdin, NULL, fdin_size);
if (sent_size == fdin_size)
slow_copy = false;
}
#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;
void* libhandle = dlopen(libname.c_str(), RTLD_LAZY);
// get library name from path
char fullpath[512] = {'\0'};
- strcpy(fullpath, libname.c_str());
+ strncpy(fullpath, libname.c_str(), 511);
#if not defined(__APPLE__)
int ret = dl_iterate_phdr(visit_libs, fullpath);
if (ret == 0)
simix_global->default_function = [executable, fdin_size](std::vector<std::string> args) {
return std::function<void()>([executable, fdin_size, args] {
-
// Copy the dynamic library:
std::string target_executable =
executable + "_" + std::to_string(getpid()) + "_" + std::to_string(rank) + ".so";
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();
smpi_backup_global_memory_segment();
// Execute the same entry point for each simulated process:
- simix_global->default_function = [entry_point](std::vector<std::string> args) {
- return std::function<void()>([entry_point, args] { smpi_run_entry_point(entry_point, args); });
+ simix_global->default_function = [entry_point, executable](std::vector<std::string> args) {
+ return std::function<void()>(
+ [entry_point, executable, args] { smpi_run_entry_point(entry_point, executable, args); });
};
}
SMPI_switch_data_segment = &smpi_switch_data_segment;
- // TODO This will not be executed in the case where smpi_main is not called,
- // e.g., not for smpi_msg_masterslave. This should be moved to another location
- // that is always called -- maybe close to Actor::on_creation?
- simgrid::s4u::Host::on_creation.connect(
- [](simgrid::s4u::Host& host) { host.extension_set(new simgrid::smpi::Host(&host)); });
-
// parse the platform file: get the host list
simgrid::s4u::Engine::get_instance()->load_platform(argv[1]);
SIMIX_comm_set_copy_data_callback(smpi_comm_copy_buffer_callback);
process_data.erase(it);
}
});
+ simgrid::s4u::Host::on_creation.connect(
+ [](simgrid::s4u::Host& host) { host.extension_set(new simgrid::smpi::Host(&host)); });
smpi_init_options();
smpi_global_init();