X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/271068c7d949ed959313b055466e13539485bc2c..9755bcbdab9bd6813d914915ef3887b78166f845:/src/smpi/mpi/smpi_comm.cpp diff --git a/src/smpi/mpi/smpi_comm.cpp b/src/smpi/mpi/smpi_comm.cpp index fdd8b69d2a..e4e9929a0b 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; @@ -48,10 +49,10 @@ Comm::Comm(MPI_Group group, MPI_Topology topo, int smp, int in_id) : group_(grou id=global_id_; global_id_++; } - Colls::bcast(&id, 1, MPI_INT, 0, this); + colls::bcast(&id, 1, MPI_INT, 0, this); XBT_DEBUG("Communicator %p has id %d", this, id); id_=id;//only set here, as we don't want to change it in the middle of the bcast - Colls::barrier(this); + colls::barrier(this); } } @@ -61,12 +62,11 @@ void Comm::destroy(Comm* comm) Comm::destroy(smpi_process()->comm_world()); return; } - delete comm->topo_; // there's no use count on topos Comm::unref(comm); } int Comm::dup(MPI_Comm* newcomm){ - if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) { + if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) { // we need to switch as the called function may silently touch global variables smpi_switch_data_segment(s4u::Actor::self()); } @@ -121,6 +121,7 @@ int Comm::dup_with_info(MPI_Info info, MPI_Comm* newcomm){ (*newcomm)->info_=MPI_INFO_NULL; } if(info != MPI_INFO_NULL){ + info->ref(); (*newcomm)->info_=info; } return ret; @@ -334,6 +335,11 @@ void Comm::unref(Comm* comm){ if(comm->refcount_==0){ comm->cleanup_smp(); 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; } } @@ -380,7 +386,7 @@ void Comm::init_smp(){ smpi_process()->set_replaying(false); } - if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) { + if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) { // we need to switch as the called function may silently touch global variables smpi_switch_data_segment(s4u::Actor::self()); } @@ -395,7 +401,7 @@ void Comm::init_smp(){ allgather__ring(&leader, 1, MPI_INT , leaders_map, 1, MPI_INT, this); - if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) { + if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) { // we need to switch as the called function may silently touch global variables smpi_switch_data_segment(s4u::Actor::self()); } @@ -418,6 +424,7 @@ void Comm::init_smp(){ leader_group_size++; } } + xbt_assert(leader_group_size > 0); std::sort(leader_list, leader_list + leader_group_size); MPI_Group leaders_group = new Group(leader_group_size); @@ -468,7 +475,7 @@ void Comm::init_smp(){ } bcast__scatter_LR_allgather(&(is_uniform_),1, MPI_INT, 0, comm_intra ); - if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) { + if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) { // we need to switch as the called function may silently touch global variables smpi_switch_data_segment(s4u::Actor::self()); } @@ -537,27 +544,37 @@ void Comm::finish_rma_calls(){ } } -MPI_Info Comm::info(){ - if(info_== MPI_INFO_NULL) +MPI_Info Comm::info() +{ + if (info_ == MPI_INFO_NULL) info_ = new Info(); info_->ref(); return info_; } -void Comm::set_info(MPI_Info info){ - if(info_!= MPI_INFO_NULL) +void Comm::set_info(MPI_Info info) +{ + if (info_ != MPI_INFO_NULL) + simgrid::smpi::Info::unref(info); + info_ = info; + if (info_ != MPI_INFO_NULL) info->ref(); - info_=info; } -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)