X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9104957deccc59e0e804215d5db498fabfd40d29..2750bde086c69304587076350db922bfd9da04f6:/src/smpi/mpi/smpi_topo.cpp diff --git a/src/smpi/mpi/smpi_topo.cpp b/src/smpi/mpi/smpi_topo.cpp index d2d0eed3b7..425a47909f 100644 --- a/src/smpi/mpi/smpi_topo.cpp +++ b/src/smpi/mpi/smpi_topo.cpp @@ -23,8 +23,6 @@ void Topo::setComm(MPI_Comm comm) { xbt_assert(not comm_); comm_ = comm; - if (comm_) - comm_->topo_ = this; } /******************************************************************************* @@ -75,20 +73,21 @@ Topo_Cart::Topo_Cart(MPI_Comm comm_old, int ndims, const int dims[], const int p for (int i = 0 ; i < newSize ; i++) { newGroup->set_mapping(oldGroup->actor(i), i); } - *comm_cart = new Comm(newGroup, this); + *comm_cart = new Comm(newGroup, std::shared_ptr(this)); } } else { if(comm_cart != nullptr){ if (rank == 0) { - MPI_Group group = new Group(MPI_COMM_SELF->group()); - *comm_cart = new Comm(group, this); + auto* group = new Group(MPI_COMM_SELF->group()); + *comm_cart = new Comm(group, std::shared_ptr(this)); } else { *comm_cart = MPI_COMM_NULL; } } } - if(comm_cart != nullptr) + if(comm_cart != nullptr){ setComm(*comm_cart); + } } Topo_Cart* Topo_Cart::sub(const int remain_dims[], MPI_Comm *newcomm) { @@ -111,7 +110,7 @@ Topo_Cart* Topo_Cart::sub(const int remain_dims[], MPI_Comm *newcomm) { // that should not segfault int j = 0; - for (int i = 0 ; j < newNDims ; i++) { + for (int i = 0; i < oldNDims; i++) { if(remain_dims[i]) { newDims[j] =dims_[i]; newPeriodic[j] =periodic_[i]; @@ -132,8 +131,10 @@ Topo_Cart* Topo_Cart::sub(const int remain_dims[], MPI_Comm *newcomm) { res = new Topo_Cart(getComm(), newNDims, newDims, newPeriodic, 0, newcomm); } else { *newcomm = getComm()->split(color, getComm()->rank()); - res = new Topo_Cart(getComm(), newNDims, newDims, newPeriodic, 0, nullptr); + auto topo = std::make_shared(getComm(), newNDims, newDims, newPeriodic, 0, nullptr); + res = topo.get(); res->setComm(*newcomm); + (*newcomm)->set_topo(topo); } delete[] newDims; delete[] newPeriodic; @@ -206,7 +207,7 @@ int Topo_Cart::shift(int direction, int disp, int* rank_source, int* rank_dest) return MPI_ERR_DIMS; } - int* position = new int[ndims_]; + auto* position = new int[ndims_]; this->coords(getComm()->rank(), ndims_, position); position[direction] += disp; @@ -237,7 +238,8 @@ int Topo_Cart::shift(int direction, int disp, int* rank_source, int* rank_dest) return MPI_SUCCESS; } -int Topo_Cart::dim_get(int *ndims) { +int Topo_Cart::dim_get(int* ndims) const +{ *ndims =ndims_; return MPI_SUCCESS; } @@ -358,7 +360,7 @@ static int assignnodes(int ndim, int nfactor, const int* pfacts, int** pdims) } /* Allocate and initialize the bins */ - int *bins = new int[ndim]; + auto* bins = new int[ndim]; *pdims = bins; int *p = bins;