Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix refcounting of smpi::Info.
[simgrid.git] / src / smpi / mpi / smpi_comm.cpp
index fdd8b69..d6ca527 100644 (file)
@@ -48,10 +48,10 @@ Comm::Comm(MPI_Group group, MPI_Topology topo, int smp, int in_id) : group_(grou
       id=global_id_;
       global_id_++;
     }
-    Colls::bcast(&id, 1, MPI_INT, 0, this);
+    colls::bcast(&id, 1, MPI_INT, 0, this);
     XBT_DEBUG("Communicator %p has id %d", this, id);
     id_=id;//only set here, as we don't want to change it in the middle of the bcast
-    Colls::barrier(this);
+    colls::barrier(this);
   }
 }
 
@@ -61,12 +61,11 @@ void Comm::destroy(Comm* comm)
     Comm::destroy(smpi_process()->comm_world());
     return;
   }
-  delete comm->topo_; // there's no use count on topos
   Comm::unref(comm);
 }
 
 int Comm::dup(MPI_Comm* newcomm){
-  if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) {
+  if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) {
     // we need to switch as the called function may silently touch global variables
     smpi_switch_data_segment(s4u::Actor::self());
   }
@@ -121,6 +120,7 @@ int Comm::dup_with_info(MPI_Info info, MPI_Comm* newcomm){
     (*newcomm)->info_=MPI_INFO_NULL;
   }
   if(info != MPI_INFO_NULL){
+    info->ref();
     (*newcomm)->info_=info;
   }
   return ret;
@@ -334,6 +334,9 @@ void Comm::unref(Comm* comm){
   if(comm->refcount_==0){
     comm->cleanup_smp();
     comm->cleanup_attr<Comm>();
+    if (comm->info_ != MPI_INFO_NULL)
+      simgrid::smpi::Info::unref(comm->info_);
+    delete comm->topo_; // there's no use count on topos
     delete comm;
   }
 }
@@ -380,7 +383,7 @@ void Comm::init_smp(){
     smpi_process()->set_replaying(false);
   }
 
-  if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) {
+  if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) {
     // we need to switch as the called function may silently touch global variables
     smpi_switch_data_segment(s4u::Actor::self());
   }
@@ -395,7 +398,7 @@ void Comm::init_smp(){
 
   allgather__ring(&leader, 1, MPI_INT , leaders_map, 1, MPI_INT, this);
 
-  if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) {
+  if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) {
     // we need to switch as the called function may silently touch global variables
     smpi_switch_data_segment(s4u::Actor::self());
   }
@@ -468,7 +471,7 @@ void Comm::init_smp(){
   }
   bcast__scatter_LR_allgather(&(is_uniform_),1, MPI_INT, 0, comm_intra );
 
-  if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) {
+  if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) {
     // we need to switch as the called function may silently touch global variables
     smpi_switch_data_segment(s4u::Actor::self());
   }
@@ -537,17 +540,21 @@ void Comm::finish_rma_calls(){
   }
 }
 
-MPI_Info Comm::info(){
-  if(info_== MPI_INFO_NULL)
+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)
+void Comm::set_info(MPI_Info info)
+{
+  if (info_ != MPI_INFO_NULL)
+    simgrid::smpi::Info::unref(info);
+  info_ = info;
+  if (info_ != MPI_INFO_NULL)
     info->ref();
-  info_=info;
 }
 
 MPI_Errhandler Comm::errhandler(){