From 3ae3a4b85d0ac22efcbb06529150e90521008c9e Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Thu, 12 Dec 2019 10:35:23 +0100 Subject: [PATCH] Fix refcounting of smpi::Errhandler. --- src/smpi/bindings/smpi_mpi.cpp | 9 ++++++--- src/smpi/bindings/smpi_pmpi_comm.cpp | 4 +++- src/smpi/bindings/smpi_pmpi_file.cpp | 4 +++- src/smpi/bindings/smpi_pmpi_win.cpp | 4 +++- src/smpi/mpi/smpi_comm.cpp | 19 ++++++++++++++----- src/smpi/mpi/smpi_file.cpp | 20 +++++++++++++++----- src/smpi/mpi/smpi_win.cpp | 9 ++++++++- 7 files changed, 52 insertions(+), 17 deletions(-) diff --git a/src/smpi/bindings/smpi_mpi.cpp b/src/smpi/bindings/smpi_mpi.cpp index 7249a491f2..7c200bf740 100644 --- a/src/smpi/bindings/smpi_mpi.cpp +++ b/src/smpi/bindings/smpi_mpi.cpp @@ -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__); \ diff --git a/src/smpi/bindings/smpi_pmpi_comm.cpp b/src/smpi/bindings/smpi_pmpi_comm.cpp index 9cefd11842..d21205fb0a 100644 --- a/src/smpi/bindings/smpi_pmpi_comm.cpp +++ b/src/smpi/bindings/smpi_pmpi_comm.cpp @@ -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; } diff --git a/src/smpi/bindings/smpi_pmpi_file.cpp b/src/smpi/bindings/smpi_pmpi_file.cpp index e84d07fc7c..cf10029cbd 100644 --- a/src/smpi/bindings/smpi_pmpi_file.cpp +++ b/src/smpi/bindings/smpi_pmpi_file.cpp @@ -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; } diff --git a/src/smpi/bindings/smpi_pmpi_win.cpp b/src/smpi/bindings/smpi_pmpi_win.cpp index aaff7ad135..c007962c62 100644 --- a/src/smpi/bindings/smpi_pmpi_win.cpp +++ b/src/smpi/bindings/smpi_pmpi_win.cpp @@ -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; } diff --git a/src/smpi/mpi/smpi_comm.cpp b/src/smpi/mpi/smpi_comm.cpp index d6ca527e3f..5248ee9b17 100644 --- a/src/smpi/mpi/smpi_comm.cpp +++ b/src/smpi/mpi/smpi_comm.cpp @@ -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(); 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) diff --git a/src/smpi/mpi/smpi_file.cpp b/src/smpi/mpi/smpi_file.cpp index 4c22c662a6..4585a583ed 100644 --- a/src/smpi/mpi/smpi_file.cpp +++ b/src/smpi/mpi/smpi_file.cpp @@ -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(); } } } diff --git a/src/smpi/mpi/smpi_win.cpp b/src/smpi/mpi/smpi_win.cpp index 588e5cfea7..4d74e826f9 100644 --- a/src/smpi/mpi/smpi_win.cpp +++ b/src/smpi/mpi/smpi_win.cpp @@ -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 -- 2.20.1