Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix refcounting of smpi::Errhandler.
[simgrid.git] / src / smpi / mpi / smpi_win.cpp
index f2adc8c..4d74e82 100644 (file)
@@ -43,15 +43,16 @@ Win::Win(void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm,
   }
   mode_=0;
   errhandler_=MPI_ERRORS_ARE_FATAL;
+  errhandler_->ref();
   comm->add_rma_win(this);
   comm->ref();
 
-  Colls::allgather(&(connected_wins_[rank_]), sizeof(MPI_Win), MPI_BYTE, connected_wins_, sizeof(MPI_Win),
-                         MPI_BYTE, comm);
+  colls::allgather(&(connected_wins_[rank_]), sizeof(MPI_Win), MPI_BYTE, connected_wins_, sizeof(MPI_Win), MPI_BYTE,
+                   comm);
 
-  Colls::bcast(&(bar_), sizeof(s4u::Barrier*), MPI_BYTE, 0, comm);
+  colls::bcast(&(bar_), sizeof(s4u::Barrier*), MPI_BYTE, 0, comm);
 
-  Colls::barrier(comm);
+  colls::barrier(comm);
 }
 
 Win::~Win(){
@@ -66,13 +67,14 @@ Win::~Win(){
   if (name_ != nullptr){
     xbt_free(name_);
   }
-  if(info_!=MPI_INFO_NULL){
-    MPI_Info_free(&info_);
-  }
+  if (info_ != MPI_INFO_NULL)
+    simgrid::smpi::Info::unref(info_);
+  if (errhandler_ != MPI_ERRHANDLER_NULL)
+    simgrid::smpi::Errhandler::unref(errhandler_);
 
   comm_->remove_rma_win(this);
 
-  Colls::barrier(comm_);
+  colls::barrier(comm_);
   Comm::unref(comm_);
   
   if (rank_ == 0)
@@ -118,8 +120,9 @@ void Win::get_group(MPI_Group* group){
   }
 }
 
-MPI_Info Win::info(){
-  if(info_== MPI_INFO_NULL)
+MPI_Info Win::info()
+{
+  if (info_ == MPI_INFO_NULL)
     info_ = new Info();
   info_->ref();
   return info_;
@@ -145,10 +148,13 @@ int Win::dynamic(){
   return dynamic_;
 }
 
-void Win::set_info(MPI_Info info){
-  if(info_!= MPI_INFO_NULL)
-    info->ref();
-  info_=info;
+void Win::set_info(MPI_Info info)
+{
+  if (info_ != MPI_INFO_NULL)
+    simgrid::smpi::Info::unref(info_);
+  info_ = info;
+  if (info_ != MPI_INFO_NULL)
+    info_->ref();
 }
 
 void Win::set_name(const char* name){
@@ -239,8 +245,7 @@ int Win::put(const void *origin_addr, int origin_count, MPI_Datatype origin_data
     recv_win->requests_->push_back(rreq);
     rreq->start();
     recv_win->mut_->unlock();
-
-  }else{
+  } else {
     XBT_DEBUG("Entering MPI_Put from myself to myself, rank %d", target_rank);
     Datatype::copy(origin_addr, origin_count, origin_datatype, recv_addr, target_count, target_datatype);
     if(request!=nullptr)
@@ -300,17 +305,14 @@ int Win::get( void *origin_addr, int origin_count, MPI_Datatype origin_datatype,
       requests_->push_back(rreq);
       mut_->unlock();
     }
-
-  }else{
+  } else {
     Datatype::copy(send_addr, target_count, target_datatype, origin_addr, origin_count, origin_datatype);
     if(request!=nullptr)
       *request=MPI_REQUEST_NULL;
   }
-
   return MPI_SUCCESS;
 }
 
-
 int Win::accumulate(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
               MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Request* request)
 {
@@ -402,7 +404,6 @@ int Win::get_accumulate(const void* origin_addr, int origin_count, MPI_Datatype
     Request::wait(&req, MPI_STATUS_IGNORE);
   send_win->atomic_mut_->unlock();
   return MPI_SUCCESS;
-
 }
 
 int Win::compare_and_swap(const void *origin_addr, void *compare_addr,
@@ -739,15 +740,20 @@ int Win::shared_query(int rank, MPI_Aint* size, int* disp_unit, void* baseptr)
   return MPI_SUCCESS;
 }
 
-MPI_Errhandler Win::errhandler(){
+MPI_Errhandler Win::errhandler()
+{
+  if (errhandler_ != MPI_ERRHANDLER_NULL)
+    errhandler_->ref();
   return errhandler_;
 }
 
-void Win::set_errhandler(MPI_Errhandler errhandler){
-  errhandler_=errhandler;
-  if(errhandler_!= MPI_ERRHANDLER_NULL)
-    errhandler->ref();
-}
-
-}
-}
+void Win::set_errhandler(MPI_Errhandler errhandler)
+{
+  if (errhandler_ != MPI_ERRHANDLER_NULL)
+    simgrid::smpi::Errhandler::unref(errhandler_);
+  errhandler_ = errhandler;
+  if (errhandler_ != MPI_ERRHANDLER_NULL)
+    errhandler_->ref();
+}
+} // namespace smpi
+} // namespace simgrid