X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f89671e0bd7450461d70d5ced6079123e73c2a63..9755bcbdab9bd6813d914915ef3887b78166f845:/src/smpi/mpi/smpi_win.cpp diff --git a/src/smpi/mpi/smpi_win.cpp b/src/smpi/mpi/smpi_win.cpp index f2adc8c99d..c7450299fe 100644 --- a/src/smpi/mpi/smpi_win.cpp +++ b/src/smpi/mpi/smpi_win.cpp @@ -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, @@ -734,20 +735,25 @@ int Win::shared_query(int rank, MPI_Aint* size, int* disp_unit, void* baseptr) *static_cast(baseptr) = target_win->base_; } else { *size = 0; - *static_cast(baseptr) = xbt_malloc(0); + *static_cast(baseptr) = nullptr; } 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