X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/239a4433346f0075799df91488cf081f2a0d7b57..f6de2ab540fe1bc9c0ede1591d28ff2d4dfddd0e:/src/smpi/internals/smpi_actor.cpp diff --git a/src/smpi/internals/smpi_actor.cpp b/src/smpi/internals/smpi_actor.cpp index 41bca6b497..c918f1acb5 100644 --- a/src/smpi/internals/smpi_actor.cpp +++ b/src/smpi/internals/smpi_actor.cpp @@ -6,6 +6,7 @@ #include "src/smpi/include/smpi_actor.hpp" #include "mc/mc.h" #include "smpi_comm.hpp" +#include "smpi_info.hpp" #include "src/mc/mc_replay.hpp" #include "src/simix/smx_private.hpp" @@ -50,6 +51,8 @@ ActorExt::ActorExt(s4u::ActorPtr actor) : actor_(actor) ActorExt::~ActorExt() { + TRACE_smpi_finalize(actor_->get_pid()); + if (comm_self_ != MPI_COMM_NULL) simgrid::smpi::Comm::destroy(comm_self_); if (comm_intra_ != MPI_COMM_NULL) @@ -63,11 +66,7 @@ void ActorExt::finalize() state_ = SmpiProcessState::FINALIZED; XBT_DEBUG("<%ld> Process left the game", actor_->get_pid()); - // This leads to an explosion of the search graph which cannot be reduced: - if (MC_is_active() || MC_record_replay_is_active()) - return; - // wait for all pending asynchronous comms to finish - finalization_barrier_->wait(); + smpi_deployment_unregister_process(instance_id_); } /** @brief Check if a process is finalized */ @@ -182,6 +181,8 @@ MPI_Comm ActorExt::comm_self() MPI_Info ActorExt::info_env() { + if (info_env_==MPI_INFO_NULL) + info_env_=new Info(); return info_env_; } @@ -213,7 +214,7 @@ void ActorExt::init() simgrid::s4u::ActorPtr self = simgrid::s4u::Actor::self(); // cheinrich: I'm not sure what the impact of the SMPI_switch_data_segment on this call is. I moved // this up here so that I can set the privatized region before the switch. - ActorExt* ext = smpi_process_remote(self); + ActorExt* ext = smpi_process(); // if we are in MPI_Init and argc handling has already been done. if (ext->initialized()) return; @@ -225,17 +226,13 @@ void ActorExt::init() SMPI_switch_data_segment(self); } - std::string instance_id = self->get_property("instance_id"); - const int rank = xbt_str_parse_int(self->get_property("rank"), "Cannot parse rank"); + ext->instance_id_ = self->get_property("instance_id"); + const int rank = xbt_str_parse_int(self->get_property("rank"), "Cannot parse rank"); ext->state_ = SmpiProcessState::INITIALIZING; - smpi_deployment_register_process(instance_id, rank, self); + smpi_deployment_register_process(ext->instance_id_, rank, self); - ext->instance_id_ = instance_id; - ext->comm_world_ = smpi_deployment_comm_world(instance_id); - simgrid::s4u::Barrier* barrier = smpi_deployment_finalization_barrier(instance_id); - if (barrier != nullptr) // don't overwrite the current one if the instance has none - ext->finalization_barrier_ = barrier; + ext->comm_world_ = smpi_deployment_comm_world(ext->instance_id_); // set the process attached to the mailbox ext->mailbox_small_->set_receiver(ext->actor_);