Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge commit 'c619e9d16'
[simgrid.git] / src / smpi / internals / smpi_global.cpp
index aaef32d..5a91379 100644 (file)
@@ -15,6 +15,8 @@
 
 #include <algorithm>
 #include <cfloat> /* DBL_MAX */
+#include <cinttypes>
+#include <cstdint> /* intmax_t */
 #include <dlfcn.h>
 #include <fcntl.h>
 #include <fstream>
@@ -29,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
@@ -53,12 +55,14 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_kernel, smpi, "Logging specific to SMPI (ke
   extern "C" void _gfortran_set_args(int, char **);
 #endif
 
-#ifndef RTLD_DEEPBIND
 /* RTLD_DEEPBIND is a bad idea of GNU ld that obviously does not exist on other platforms
  * See https://www.akkadia.org/drepper/dsohowto.pdf
  * and https://lists.freebsd.org/pipermail/freebsd-current/2016-March/060284.html
 */
-#define RTLD_DEEPBIND 0
+#if !defined(RTLD_DEEPBIND) || HAVE_SANITIZER_ADDRESS || HAVE_SANITIZER_THREAD
+#define WANT_RTLD_DEEPBIND 0
+#else
+#define WANT_RTLD_DEEPBIND RTLD_DEEPBIND
 #endif
 
 #if HAVE_PAPI
@@ -128,10 +132,6 @@ void smpi_process_init(int *argc, char ***argv){
   simgrid::smpi::ActorExt::init(argc, argv);
 }
 
-int smpi_process_index(){
-  return simgrid::s4u::this_actor::get_pid();
-}
-
 void * smpi_process_get_user_data(){
   return Actor::self()->get_impl()->get_user_data();
 }
@@ -491,31 +491,36 @@ static void smpi_copy_file(std::string src, std::string target, off_t fdin_size)
   int fdout = open(target.c_str(), O_CREAT | O_RDWR, S_IRWXU);
   xbt_assert(fdout >= 0, "Cannot write into %s", target.c_str());
 
-  XBT_DEBUG("Copy %ld bytes into %s", static_cast<long>(fdin_size), target.c_str());
+  XBT_DEBUG("Copy %" PRIdMAX " bytes into %s", static_cast<intmax_t>(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 %ld (errno: %d -- %s)",
-             target.c_str(), sent_size, 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<intmax_t>(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);
 }
@@ -577,7 +582,7 @@ static void smpi_init_privatization_dlopen(std::string executable)
 
       smpi_copy_file(executable, target_executable, fdin_size);
       // if smpi/privatize-libs is set, duplicate pointed lib and link each executable copy to a different one.
-      std::string target_lib;
+      std::vector<std::string> target_libs;
       for (auto const& libpath : privatize_libs_paths) {
         // if we were given a full path, strip it
         size_t index = libpath.find_last_of("/\\");
@@ -596,8 +601,9 @@ static void smpi_init_privatization_dlopen(std::string executable)
           unsigned int pad = 7;
           if (libname.length() < pad)
             pad = libname.length();
-          target_lib =
+          std::string target_lib =
               std::string(pad - std::to_string(rank).length(), '0') + std::to_string(rank) + libname.substr(pad);
+          target_libs.push_back(target_lib);
           XBT_DEBUG("copy lib %s to %s, with size %lld", libpath.c_str(), target_lib.c_str(), (long long)fdin_size2);
           smpi_copy_file(libpath, target_lib, fdin_size2);
 
@@ -610,11 +616,11 @@ static void smpi_init_privatization_dlopen(std::string executable)
 
       rank++;
       // Load the copy and resolve the entry point:
-      void* handle    = dlopen(target_executable.c_str(), RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND);
+      void* handle    = dlopen(target_executable.c_str(), RTLD_LAZY | RTLD_LOCAL | WANT_RTLD_DEEPBIND);
       int saved_errno = errno;
       if (simgrid::config::get_value<bool>("smpi/keep-temps") == false) {
         unlink(target_executable.c_str());
-        if (not target_lib.empty())
+        for (const std::string& target_lib : target_libs)
           unlink(target_lib.c_str());
       }
       if (handle == nullptr)