Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
cleanup dup_with_info to avoid leaking in some cases
[simgrid.git] / src / smpi / mpi / smpi_comm.cpp
index 92d2f49..adb7a99 100644 (file)
@@ -8,6 +8,7 @@
 #include "smpi_datatype.hpp"
 #include "smpi_request.hpp"
 #include "smpi_win.hpp"
+#include "smpi_info.hpp"
 #include "src/smpi/include/smpi_actor.hpp"
 #include "src/surf/HostImpl.hpp"
 
@@ -37,6 +38,7 @@ Comm::Comm(MPI_Group group, MPI_Topology topo, int smp) : group_(group), topo_(t
   non_uniform_map_ = nullptr;
   leaders_map_     = nullptr;
   is_blocked_      = 0;
+  info_            = MPI_INFO_NULL;
 }
 
 void Comm::destroy(Comm* comm)
@@ -88,6 +90,21 @@ int Comm::dup(MPI_Comm* newcomm){
       }
     }
   }
+  //duplicate info if present
+  if(info_!=MPI_INFO_NULL)
+    (*newcomm)->info_ = new simgrid::smpi::Info(info_);
+  return ret;
+}
+
+int Comm::dup_with_info(MPI_Info info, MPI_Comm* newcomm){
+  int ret = dup(newcomm);
+  if((*newcomm)->info_!=MPI_INFO_NULL){
+    simgrid::smpi::Info::unref((*newcomm)->info_);
+    (*newcomm)->info_=MPI_INFO_NULL;
+  }
+  if(info != MPI_INFO_NULL){
+    (*newcomm)->info_=info;
+  }
   return ret;
 }
 
@@ -129,7 +146,7 @@ void Comm::get_name (char* name, int* len)
   }
 }
 
-void Comm::set_name (char* name)
+void Comm::set_name (const char* name)
 {
   if (this == MPI_COMM_UNINITIALIZED){
     smpi_process()->comm_world()->set_name(name);
@@ -503,15 +520,32 @@ void Comm::finish_rma_calls(){
   }
 }
 
-MPI_Comm Comm::split_type(int type, int key, MPI_Info info)
+MPI_Info Comm::info(){
+  if(info_== MPI_INFO_NULL)
+    info_ = new Info();
+  info_->ref();
+  return info_;
+}
+
+void Comm::set_info(MPI_Info info){
+  if(info_!= MPI_INFO_NULL)
+    info->ref();
+  info_=info;
+}
+
+MPI_Comm Comm::split_type(int type, int /*key*/, MPI_Info)
 {
-  if(type != MPI_COMM_TYPE_SHARED){
+  //MPI_UNDEFINED can be given to some nodes... but we need them to still perform the smp part which is collective
+  if(type != MPI_COMM_TYPE_SHARED && type != MPI_UNDEFINED){
     return MPI_COMM_NULL;
   }
   this->init_smp();
   this->ref();
   this->get_intra_comm()->ref();
-  return this->get_intra_comm();
+  if(type != MPI_UNDEFINED)
+    return this->get_intra_comm();
+  else
+    return MPI_COMM_NULL;
 }
 
 } // namespace smpi