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__); \
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;
}
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;
}
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;
}
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;
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;
}
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)
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);
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){
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();
}
}
}
}
mode_=0;
errhandler_=MPI_ERRORS_ARE_FATAL;
+ errhandler_->ref();
comm->add_rma_win(this);
comm->ref();
}
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);
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