X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/4bfa8a32e0083bcd28a78689625c4806c2fbbf46..2d37e348a09783cda723c7019640ee69de168324:/src/smpi/mpi/smpi_group.cpp diff --git a/src/smpi/mpi/smpi_group.cpp b/src/smpi/mpi/smpi_group.cpp index 12c412cce1..d4d2d86cde 100644 --- a/src/smpi/mpi/smpi_group.cpp +++ b/src/smpi/mpi/smpi_group.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2018. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2010-2019. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -25,7 +25,7 @@ Group::Group() refcount_ = 1; /* refcount_: start > 0 so that this group never gets freed */ } -Group::Group(int n) : size_(n), rank_to_actor_map_(size_, nullptr) +Group::Group(int n) : size_(n), rank_to_actor_map_(size_, nullptr), index_to_rank_map_(size_, MPI_UNDEFINED) { refcount_ = 1; } @@ -35,6 +35,8 @@ Group::Group(Group* origin) if (origin != MPI_GROUP_NULL && origin != MPI_GROUP_EMPTY) { size_ = origin->size(); refcount_ = 1; + // FIXME: cheinrich: There is no such thing as an index any more; the two maps should be removed + index_to_rank_map_ = origin->index_to_rank_map_; rank_to_actor_map_ = origin->rank_to_actor_map_; actor_to_rank_map_ = origin->actor_to_rank_map_; } @@ -44,6 +46,11 @@ void Group::set_mapping(simgrid::s4u::ActorPtr actor, int rank) { if (0 <= rank && rank < size_) { int index = actor->get_pid(); + if (index != MPI_UNDEFINED) { + if ((unsigned)index >= index_to_rank_map_.size()) + index_to_rank_map_.resize(index + 1, MPI_UNDEFINED); + index_to_rank_map_[index] = rank; + } rank_to_actor_map_[rank] = actor; if (actor != nullptr) { @@ -52,6 +59,17 @@ void Group::set_mapping(simgrid::s4u::ActorPtr actor, int rank) } } +int Group::rank(int index) +{ + int rank; + if (0 <= index && (unsigned)index < index_to_rank_map_.size()) + rank = index_to_rank_map_[index]; + else + rank = MPI_UNDEFINED; + + return rank; +} + simgrid::s4u::ActorPtr Group::actor(int rank) { if (0 <= rank && rank < size_) return rank_to_actor_map_[rank];