Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Make cleanupSurf() private.
[simgrid.git] / src / smpi / internals / smpi_global.cpp
index 4d7b985..c8253ee 100644 (file)
@@ -59,7 +59,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_kernel, smpi, "Logging specific to SMPI (ke
  * See https://www.akkadia.org/drepper/dsohowto.pdf
  * and https://lists.freebsd.org/pipermail/freebsd-current/2016-March/060284.html
 */
-#if !defined(RTLD_DEEPBIND) || HAVE_SANITIZER_ADDRESS || HAVE_SANITIZER_THREAD
+#if !RTLD_DEEPBIND || HAVE_SANITIZER_ADDRESS || HAVE_SANITIZER_THREAD
 #define WANT_RTLD_DEEPBIND 0
 #else
 #define WANT_RTLD_DEEPBIND RTLD_DEEPBIND
@@ -168,7 +168,7 @@ static void check_blocks(std::vector<std::pair<size_t, size_t>> &private_blocks,
 void smpi_comm_copy_buffer_callback(smx_activity_t synchro, void *buff, size_t buff_size)
 {
   simgrid::kernel::activity::CommImplPtr comm =
-      boost::dynamic_pointer_cast<simgrid::kernel::activity::CommImpl>(synchro);
+      boost::static_pointer_cast<simgrid::kernel::activity::CommImpl>(synchro);
   int src_shared                        = 0;
   int dst_shared                        = 0;
   size_t src_offset                     = 0;
@@ -488,7 +488,7 @@ static smpi_entry_point_type smpi_resolve_function(void* handle)
   return smpi_entry_point_type();
 }
 
-static void smpi_copy_file(std::string src, std::string target, off_t fdin_size)
+static void smpi_copy_file(const std::string& src, const std::string& target, off_t fdin_size)
 {
   int fdin = open(src.c_str(), O_RDONLY);
   xbt_assert(fdin >= 0, "Cannot read from %s. Please make sure that the file exists and is executable.", src.c_str());
@@ -498,28 +498,30 @@ static void smpi_copy_file(std::string src, std::string target, off_t fdin_size)
   XBT_DEBUG("Copy %" PRIdMAX " bytes into %s", static_cast<intmax_t>(fdin_size), target.c_str());
 #if SG_HAVE_SENDFILE
   ssize_t sent_size = sendfile(fdout, fdin, NULL, fdin_size);
-  xbt_assert(sent_size == fdin_size || (sent_size == -1 && errno == ENOSYS),
-             "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));
-#else
-  ssize_t sent_size = -1;
+  if (sent_size == fdin_size) {
+    close(fdin);
+    close(fdout);
+    return;
+  } 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 (sent_size != fdin_size) { // sendfile is not available
-    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 this point is reached, sendfile() actually is not available.  Copy file by hand.
+  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;
         }
       }
     }