Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix refcounting of smpi::Errhandler.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Thu, 12 Dec 2019 09:35:23 +0000 (10:35 +0100)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Thu, 12 Dec 2019 13:16:52 +0000 (14:16 +0100)
src/smpi/bindings/smpi_mpi.cpp
src/smpi/bindings/smpi_pmpi_comm.cpp
src/smpi/bindings/smpi_pmpi_file.cpp
src/smpi/bindings/smpi_pmpi_win.cpp
src/smpi/mpi/smpi_comm.cpp
src/smpi/mpi/smpi_file.cpp
src/smpi/mpi/smpi_win.cpp

index 7249a49..7c200bf 100644 (file)
@@ -39,12 +39,15 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_mpi, smpi, "Logging specific to SMPI ,(mpi)
       char error_string[MPI_MAX_ERROR_STRING];                                                                         \
       int error_size;                                                                                                  \
       PMPI_Error_string(ret, error_string, &error_size);                                                               \
-      if ((errhan) == nullptr || (errhan)->errhandler() == MPI_ERRORS_RETURN)                                          \
+      MPI_Errhandler err = (errhan) ? (errhan)->errhandler() : MPI_ERRHANDLER_NULL;                                    \
+      if (err == MPI_ERRHANDLER_NULL || err == MPI_ERRORS_RETURN)                                                      \
         XBT_WARN("%s - returned %.*s instead of MPI_SUCCESS", __func__, error_size, error_string);                     \
-      else if ((errhan)->errhandler() == MPI_ERRORS_ARE_FATAL)                                                         \
+      else if (err == MPI_ERRORS_ARE_FATAL)                                                                            \
         xbt_die("%s - returned %.*s instead of MPI_SUCCESS", __func__, error_size, error_string);                      \
       else                                                                                                             \
-        (errhan)->errhandler()->call((errhan), ret);                                                                   \
+        err->call((errhan), ret);                                                                                      \
+      if (err != MPI_ERRHANDLER_NULL)                                                                                  \
+        simgrid::smpi::Errhandler::unref(err);                                                                         \
       MC_assert(not MC_is_active()); /* Only fail in MC mode */                                                        \
     }                                                                                                                  \
     XBT_VERB("SMPI - Leaving %s", __func__);                                                                           \
index 9cefd11..d21205f 100644 (file)
@@ -292,7 +292,9 @@ int PMPI_Errhandler_set(MPI_Comm comm, MPI_Errhandler errhandler){
 
 int PMPI_Comm_call_errhandler(MPI_Comm comm,int errorcode){
   CHECK_COMM(1)
-  comm->errhandler()->call(comm, errorcode);
+  MPI_Errhandler err = comm->errhandler();
+  err->call(comm, errorcode);
+  simgrid::smpi::Errhandler::unref(err);
   return MPI_SUCCESS;
 }
 
index e84d07f..cf10029 100644 (file)
@@ -369,6 +369,8 @@ int PMPI_File_call_errhandler(MPI_File file,int errorcode){
   if (file == nullptr) {
     return MPI_ERR_WIN;
   }
-  file->errhandler()->call(file, errorcode);
+  MPI_Errhandler err = file->errhandler();
+  err->call(file, errorcode);
+  simgrid::smpi::Errhandler::unref(err);
   return MPI_SUCCESS;
 }
index aaff7ad..c007962 100644 (file)
@@ -703,6 +703,8 @@ int PMPI_Win_set_errhandler(MPI_Win win, MPI_Errhandler errhandler){
 
 int PMPI_Win_call_errhandler(MPI_Win win,int errorcode){
   CHECK_WIN(1, win)
-  win->errhandler()->call(win, errorcode);
+  MPI_Errhandler err = win->errhandler();
+  err->call(win, errorcode);
+  simgrid::smpi::Errhandler::unref(err);
   return MPI_SUCCESS;
 }
index d6ca527..5248ee9 100644 (file)
@@ -40,6 +40,7 @@ Comm::Comm(MPI_Group group, MPI_Topology topo, int smp, int in_id) : group_(grou
   is_blocked_      = 0;
   info_            = MPI_INFO_NULL;
   errhandler_      = MPI_ERRORS_ARE_FATAL;
+  errhandler_->ref();
   //First creation of comm is done before SIMIX_run, so only do comms for others
   if(in_id==MPI_UNDEFINED && smp==0 && this->rank()!=MPI_UNDEFINED ){
     int id;
@@ -336,6 +337,8 @@ void Comm::unref(Comm* comm){
     comm->cleanup_attr<Comm>();
     if (comm->info_ != MPI_INFO_NULL)
       simgrid::smpi::Info::unref(comm->info_);
+    if (comm->errhandler_ != MPI_ERRHANDLER_NULL)
+      simgrid::smpi::Errhandler::unref(comm->errhandler_);
     delete comm->topo_; // there's no use count on topos
     delete comm;
   }
@@ -557,14 +560,20 @@ void Comm::set_info(MPI_Info info)
     info->ref();
 }
 
-MPI_Errhandler Comm::errhandler(){
+MPI_Errhandler Comm::errhandler()
+{
+  if (errhandler_ != MPI_ERRHANDLER_NULL)
+    errhandler_->ref();
   return errhandler_;
 }
 
-void Comm::set_errhandler(MPI_Errhandler errhandler){
-  errhandler_=errhandler;
-  if(errhandler_!= MPI_ERRHANDLER_NULL)
-    errhandler->ref();
+void Comm::set_errhandler(MPI_Errhandler errhandler)
+{
+  if (errhandler_ != MPI_ERRHANDLER_NULL)
+    simgrid::smpi::Errhandler::unref(errhandler_);
+  errhandler_ = errhandler;
+  if (errhandler_ != MPI_ERRHANDLER_NULL)
+    errhandler_->ref();
 }
 
 MPI_Comm Comm::split_type(int type, int /*key*/, MPI_Info)
index 4c22c66..4585a58 100644 (file)
@@ -53,12 +53,14 @@ namespace smpi{
       int size= comm_->size() + FP_SIZE;
       list_ = new char[size];
       errhandler_= SMPI_default_File_Errhandler;
+      errhandler_->ref();
       memset(list_, 0, size);
       shared_file_pointer_ = new MPI_Offset();
       shared_mutex_ = s4u::Mutex::create();
       *shared_file_pointer_ = 0;
       win_=new Win(list_, size, 1, MPI_INFO_NULL, comm_);
     }else{
+      errhandler_ = MPI_ERRHANDLER_NULL;
       win_=new Win(list_, 0, 1, MPI_INFO_NULL, comm_);
     }
     simgrid::smpi::colls::bcast(&shared_file_pointer_, 1, MPI_AINT, 0, comm);
@@ -76,6 +78,8 @@ namespace smpi{
     delete file_;
     if (info_ != MPI_INFO_NULL)
       simgrid::smpi::Info::unref(info_);
+    if (errhandler_ != MPI_ERRHANDLER_NULL)
+      simgrid::smpi::Errhandler::unref(errhandler_);
   }
 
   int File::close(MPI_File *fh){
@@ -295,14 +299,20 @@ namespace smpi{
     return comm_;
   }
 
-  MPI_Errhandler File::errhandler(){
+  MPI_Errhandler File::errhandler()
+  {
+    if (errhandler_ != MPI_ERRHANDLER_NULL)
+      errhandler_->ref();
     return errhandler_;
   }
 
-  void File::set_errhandler(MPI_Errhandler errhandler){
-    errhandler_=errhandler;
-    if(errhandler_!= MPI_ERRHANDLER_NULL)
-      errhandler->ref();
+  void File::set_errhandler(MPI_Errhandler errhandler)
+  {
+    if (errhandler_ != MPI_ERRHANDLER_NULL)
+      simgrid::smpi::Errhandler::unref(errhandler_);
+    errhandler_ = errhandler;
+    if (errhandler_ != MPI_ERRHANDLER_NULL)
+      errhandler_->ref();
   }
 }
 }
index 588e5cf..4d74e82 100644 (file)
@@ -43,6 +43,7 @@ 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();
 
@@ -68,6 +69,8 @@ Win::~Win(){
   }
   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);
 
@@ -739,14 +742,18 @@ int Win::shared_query(int rank, MPI_Aint* size, int* disp_unit, void* baseptr)
 
 MPI_Errhandler Win::errhandler()
 {
+  if (errhandler_ != MPI_ERRHANDLER_NULL)
+    errhandler_->ref();
   return errhandler_;
 }
 
 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();
+    errhandler_->ref();
 }
 } // namespace smpi
 } // namespace simgrid