simgrid::smpi::Process* smpi_process()
{
- simgrid::MsgActorExt* msgExt = static_cast<simgrid::MsgActorExt*>(SIMIX_process_self()->data);
+ smx_actor_t me = SIMIX_process_self();
+ if (me == nullptr) // This happens sometimes (eg, when linking against NS3 because it pulls openMPI...)
+ return nullptr;
+ simgrid::MsgActorExt* msgExt = static_cast<simgrid::MsgActorExt*>(me->data);
return static_cast<simgrid::smpi::Process*>(msgExt->data);
}
return smpi_process()->index();
}
+void * smpi_process_get_user_data(){
+ return smpi_process()->get_user_data();
+}
+
+void smpi_process_set_user_data(void *data){
+ return smpi_process()->set_user_data(data);
+}
+
int smpi_global_size()
{
else
xbt_die("Invalid value for smpi/privatization: '%s'", smpi_privatize_option);
+#if defined(__FreeBSD__)
+ if (smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) {
+ XBT_INFO("Mixing mmap privatization is broken on FreeBSD, switching to dlopen privatization instead.");
+ smpi_privatize_global_variables = SMPI_PRIVATIZE_DLOPEN;
+ }
+#endif
+
if (smpi_cpu_threshold < 0)
smpi_cpu_threshold = DBL_MAX;
xbt_assert(fdout >= 0, "Cannot write into %s", target_executable.c_str());
#if HAVE_SENDFILE
- sendfile(fdout, fdin, NULL, fdin_size);
+ 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 %ld (errno: %d -- %s)",
+ target_executable.c_str(), sent_size, fdin_size, errno, strerror(errno));
#else
- XBT_WARN("Copy %d bytes into %s", static_cast<int>(fdin_size), target_executable.c_str());
+ XBT_VERB("Copy %d bytes into %s", static_cast<int>(fdin_size), target_executable.c_str());
const int bufsize = 1024 * 1024 * 4;
char buf[bufsize];
while (int got = read(fdin, buf, bufsize)) {
// Load the copy and resolve the entry point:
void* handle = dlopen(target_executable.c_str(), RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND);
- unlink(target_executable.c_str());
+ if (xbt_cfg_get_boolean("smpi/keep-temps") == false)
+ unlink(target_executable.c_str());
if (handle == nullptr)
xbt_die("dlopen failed: %s (errno: %d -- %s)", dlerror(), errno, strerror(errno));
smpi_entry_point_type entry_point = smpi_resolve_function(handle);
// Load the dynamic library and resolve the entry point:
void* handle = dlopen(executable, RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND);
if (handle == nullptr)
- xbt_die("dlopen failed for %s", executable);
+ xbt_die("dlopen failed for %s: %s (errno: %d -- %s)", executable, dlerror(), errno, strerror(errno));
smpi_entry_point_type entry_point = smpi_resolve_function(handle);
if (!entry_point)
xbt_die("main not found in %s", executable);