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 7722473..adb7a99 100644 (file)
@@ -38,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)
@@ -89,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;
 }
 
@@ -130,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);
@@ -517,15 +533,19 @@ void Comm::set_info(MPI_Info info){
   info_=info;
 }
 
-MPI_Comm Comm::split_type(int type, int key, MPI_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