From e303bc683c874808621082e409ec13bcc1b17247 Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Thu, 13 Apr 2017 03:17:35 +0200 Subject: [PATCH 1/1] portable implementation of sendfile --- CMakeLists.txt | 8 ++++++++ src/smpi/smpi_global.cpp | 26 +++++++++++++++++++++++++- tools/cmake/src/internal_config.h.in | 2 ++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ab63f19171..961c856989 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -341,6 +341,14 @@ else() set(HAVE_THREAD_LOCAL_STORAGE 0) endif() +CHECK_INCLUDE_FILE("sys/sendfile.h" HAVE_SENDFILE_H) +CHECK_FUNCTION_EXISTS(sendfile HAVE_SENDFILE) +if(HAVE_SENDFILE_H AND HAVE_SENDFILE) + set(HAVE_SENDFILE 1) +else() + set(HAVE_SENDFILE 0) +endif() + if(enable_model-checking AND NOT "${CMAKE_SYSTEM}" MATCHES "Linux|FreeBSD") message(WARNING "Support for model-checking has not been enabled on ${CMAKE_SYSTEM}: disabling it") set(enable_model-checking FALSE) diff --git a/src/smpi/smpi_global.cpp b/src/smpi/smpi_global.cpp index aad63d8f26..25518210f0 100644 --- a/src/smpi/smpi_global.cpp +++ b/src/smpi/smpi_global.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -38,6 +37,10 @@ #include #include +#if HAVE_SENDFILE +#include +#endif + XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_kernel, smpi, "Logging specific to SMPI (kernel)"); #include #include /* trim_right / trim_left */ @@ -543,7 +546,28 @@ int smpi_main(const char* executable, int argc, char *argv[]) int fdout = open(target_executable.c_str(), O_WRONLY); xbt_assert(fdout >= 0, "Cannot write into %s", target_executable.c_str()); +#if HAVE_SENDFILE sendfile(fdout, fdin, NULL, fdin_size); +#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", executable_copy.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_executable.c_str()); + } else { + p += done; + todo -= done; + } + } + } + } +#endif close(fdout); // Load the copy and resolve the entry point: diff --git a/tools/cmake/src/internal_config.h.in b/tools/cmake/src/internal_config.h.in index 569e39da21..4bc7710660 100644 --- a/tools/cmake/src/internal_config.h.in +++ b/tools/cmake/src/internal_config.h.in @@ -77,6 +77,8 @@ #cmakedefine01 HAVE_PRIVATIZATION /* We have PAPI to fine-grain trace execution time */ #cmakedefine01 HAVE_PAPI +/* We have sendfile to efficiently copy files for dl-open privatization */ +#cmakedefine01 HAVE_SENDFILE /* Other function checks */ /* Function backtrace */ -- 2.20.1