Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fix the dlopen privatization (fix #157)
[simgrid.git] / src / smpi / smpi_global.cpp
index e603464..5910e15 100644 (file)
@@ -131,13 +131,14 @@ void smpi_comm_set_copy_data_callback(void (*callback) (smx_activity_t, void*, s
 }
 
 static void print(std::vector<std::pair<size_t, size_t>> vec) {
-    fprintf(stderr, "{");
-    for(auto elt: vec) {
-        fprintf(stderr, "(0x%lx, 0x%lx),", elt.first, elt.second);
+  std::fprintf(stderr, "{");
+  for (auto elt : vec) {
+    std::fprintf(stderr, "(0x%zx, 0x%zx),", elt.first, elt.second);
     }
-    fprintf(stderr, "}\n");
+    std::fprintf(stderr, "}\n");
 }
-static void memcpy_private(void *dest, const void *src, size_t n, std::vector<std::pair<size_t, size_t>> &private_blocks) {
+static void memcpy_private(void* dest, const void* src, std::vector<std::pair<size_t, size_t>>& private_blocks)
+{
   for(auto block : private_blocks) {
     memcpy((uint8_t*)dest+block.first, (uint8_t*)src+block.first, block.second-block.first);
   }
@@ -152,8 +153,10 @@ 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::Comm *comm = dynamic_cast<simgrid::kernel::activity::Comm*>(synchro);
-  int src_shared=0, dst_shared=0;
-  size_t src_offset=0, dst_offset=0;
+  int src_shared                        = 0;
+  int dst_shared                        = 0;
+  size_t src_offset                     = 0;
+  size_t dst_offset                     = 0;
   std::vector<std::pair<size_t, size_t>> src_private_blocks;
   std::vector<std::pair<size_t, size_t>> dst_private_blocks;
   XBT_DEBUG("Copy the data over");
@@ -186,7 +189,7 @@ void smpi_comm_copy_buffer_callback(smx_activity_t synchro, void *buff, size_t b
        smpi_switch_data_segment(
            (static_cast<simgrid::smpi::Process*>((static_cast<simgrid::MsgActorExt*>(comm->src_proc->data)->data))->index()));
        tmpbuff = static_cast<void*>(xbt_malloc(buff_size));
-       memcpy_private(tmpbuff, buff, buff_size, private_blocks);
+       memcpy_private(tmpbuff, buff, private_blocks);
   }
 
   if((smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) && ((char*)comm->dst_buff >= smpi_start_data_exe)
@@ -196,7 +199,7 @@ void smpi_comm_copy_buffer_callback(smx_activity_t synchro, void *buff, size_t b
            (static_cast<simgrid::smpi::Process*>((static_cast<simgrid::MsgActorExt*>(comm->dst_proc->data)->data))->index()));
   }
   XBT_DEBUG("Copying %zu bytes from %p to %p", buff_size, tmpbuff,comm->dst_buff);
-  memcpy_private(comm->dst_buff, tmpbuff, buff_size, private_blocks);
+  memcpy_private(comm->dst_buff, tmpbuff, private_blocks);
 
   if (comm->detached) {
     // if this is a detached send, the source buffer was duplicated by SMPI
@@ -437,13 +440,13 @@ static void smpi_init_logs(){
 
 static void smpi_init_options(){
     //return if already called
-    if(smpi_cpu_threshold!=-1)
+    if (smpi_cpu_threshold > -1)
       return;
     simgrid::smpi::Colls::set_collectives();
     simgrid::smpi::Colls::smpi_coll_cleanup_callback=nullptr;
     smpi_cpu_threshold = xbt_cfg_get_double("smpi/cpu-threshold");
     smpi_host_speed = xbt_cfg_get_double("smpi/host-speed");
-    const char* smpi_privatize_option = xbt_cfg_get_string("smpi/privatize-global-variables");
+    const char* smpi_privatize_option               = xbt_cfg_get_string("smpi/privatization");
     if (std::strcmp(smpi_privatize_option, "no") == 0)
       smpi_privatize_global_variables = SMPI_PRIVATIZE_NONE;
     else if (std::strcmp(smpi_privatize_option, "yes") == 0)
@@ -460,8 +463,7 @@ static void smpi_init_options(){
       smpi_privatize_global_variables = SMPI_PRIVATIZE_NONE;
 
     else
-      xbt_die("Invalid value for smpi/privatize-global-variables: %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;
@@ -481,7 +483,7 @@ static void smpi_init_options(){
 
 typedef std::function<int(int argc, char *argv[])> smpi_entry_point_type;
 typedef int (* smpi_c_entry_point_type)(int argc, char **argv);
-typedef void (* smpi_fortran_entry_point_type)(void);
+typedef void (*smpi_fortran_entry_point_type)();
 
 static int smpi_run_entry_point(smpi_entry_point_type entry_point, std::vector<std::string> args)
 {
@@ -502,20 +504,17 @@ static int smpi_run_entry_point(smpi_entry_point_type entry_point, std::vector<s
 // TODO, remove the number of functions involved here
 static smpi_entry_point_type smpi_resolve_function(void* handle)
 {
-  smpi_fortran_entry_point_type entry_point2 =
-    (smpi_fortran_entry_point_type) dlsym(handle, "user_main_");
-  if (entry_point2 != nullptr) {
-    // fprintf(stderr, "EP user_main_=%p\n", entry_point2);
-    return [entry_point2](int argc, char** argv) {
+  smpi_fortran_entry_point_type entry_point_fortran = (smpi_fortran_entry_point_type)dlsym(handle, "user_main_");
+  if (entry_point_fortran != nullptr) {
+    return [entry_point_fortran](int argc, char** argv) {
       smpi_process_init(&argc, &argv);
-      entry_point2();
+      entry_point_fortran();
       return 0;
     };
   }
 
-  smpi_c_entry_point_type entry_point = (smpi_c_entry_point_type) dlsym(handle, "main");
+  smpi_c_entry_point_type entry_point = (smpi_c_entry_point_type)dlsym(handle, "main");
   if (entry_point != nullptr) {
-    // fprintf(stderr, "EP main=%p\n", entry_point);
     return entry_point;
   }
 
@@ -571,11 +570,12 @@ int smpi_main(const char* executable, int argc, char *argv[])
           + "_" + std::to_string(getpid())
           + "_" + std::to_string(rank++) + ".so";
 
-        int fdout = open(target_executable.c_str(), O_WRONLY);
+        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);
+        off_t offset = 0;
+        sendfile(fdout, fdin, &offset, fdin_size);
 #else
         XBT_WARN("Copy %d bytes into %s", static_cast<int>(fdin_size), target_executable.c_str());
         const int bufsize = 1024 * 1024 * 4;