Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fix my late sunday commit
[simgrid.git] / src / smpi / smpi_global.cpp
index cf5d342..39d769a 100644 (file)
@@ -463,7 +463,7 @@ static void smpi_init_options(){
       smpi_privatize_global_variables = SMPI_PRIVATIZE_NONE;
 
     else
-      xbt_die("Invalid value for smpi/privatization: %s", smpi_privatize_option);
+      xbt_die("Invalid value for smpi/privatization: '%s'", smpi_privatize_option);
 
     if (smpi_cpu_threshold < 0)
       smpi_cpu_threshold = DBL_MAX;
@@ -554,29 +554,31 @@ int smpi_main(const char* executable, int argc, char *argv[])
 
     std::string executable_copy = executable;
 
-    // Prepare the copy of the binary (open the file and get its size)
-    // (fdin will remain open for the whole process execution. That's a sort of leak but we can live with it)
-    int fdin = open(executable_copy.c_str(), O_RDONLY);
-    xbt_assert(fdin >= 0, "Cannot read from %s", executable_copy.c_str());
+    // Prepare the copy of the binary (get its size)
     struct stat fdin_stat;
-    fstat(fdin, &fdin_stat);
+    stat(executable_copy.c_str(), &fdin_stat);
     off_t fdin_size = fdin_stat.st_size;
 
-    simix_global->default_function = [executable_copy, fdin, fdin_size](std::vector<std::string> args) {
-      return std::function<void()>([executable_copy, fdin, fdin_size, args] {
+    simix_global->default_function = [executable_copy, fdin_size](std::vector<std::string> args) {
+      return std::function<void()>([executable_copy, fdin_size, args] {
 
         // Copy the dynamic library:
         std::string target_executable = executable_copy
           + "_" + std::to_string(getpid())
           + "_" + std::to_string(rank++) + ".so";
 
-        int fdout = open(target_executable.c_str(), O_WRONLY);
+        int fdin = open(executable_copy.c_str(), O_RDONLY);
+        xbt_assert(fdin >= 0, "Cannot read from %s", executable_copy.c_str());
+        int fdout = open(target_executable.c_str(), O_CREAT | O_RDWR, S_IRWXU);
         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)) {
@@ -596,13 +598,14 @@ int smpi_main(const char* executable, int argc, char *argv[])
           }
         }
 #endif
+        close(fdin);
         close(fdout);
 
         // 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 (handle == nullptr)
-          xbt_die("dlopen failed");
+          xbt_die("dlopen failed: %s (errno: %d -- %s)", dlerror(), errno, strerror(errno));
         smpi_entry_point_type entry_point = smpi_resolve_function(handle);
         if (!entry_point)
           xbt_die("Could not resolve entry point");
@@ -617,7 +620,7 @@ int smpi_main(const char* executable, int argc, char *argv[])
     // 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);