X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9b17fb451fc8ffce7a0448ab779133fe0f8f5749..609b277351c837356a7b284127eed888eca3620d:/src/kernel/activity/CommImpl.cpp diff --git a/src/kernel/activity/CommImpl.cpp b/src/kernel/activity/CommImpl.cpp index e9b38cef5e..8785fb7bac 100644 --- a/src/kernel/activity/CommImpl.cpp +++ b/src/kernel/activity/CommImpl.cpp @@ -190,7 +190,7 @@ bool simcall_HANDLER_comm_test(smx_simcall_t, simgrid::kernel::activity::CommImp return comm->test(); } -int simcall_HANDLER_comm_testany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl* comms[], size_t count) +ssize_t simcall_HANDLER_comm_testany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl* comms[], size_t count) { std::vector comms_vec(comms, comms + count); return simgrid::kernel::activity::CommImpl::test_any(simcall->issuer_, comms_vec); @@ -306,9 +306,9 @@ CommImpl* CommImpl::start() from_ = from_ != nullptr ? from_ : src_actor_->get_host(); to_ = to_ != nullptr ? to_ : dst_actor_->get_host(); - /* FIXME[donassolo]: getting the network_model from the origin host - * Soon we need to change this function to first get the routes and later - * create the respective surf actions */ + /* Getting the network_model from the origin host + * Valid while we have a single network model, otherwise we would need to change this function to first get the + * routes and later create the respective surf actions */ auto net_model = from_->get_netpoint()->get_englobing_zone()->get_network_model(); surf_action_ = net_model->communicate(from_, to_, size_, rate_); @@ -328,8 +328,8 @@ CommImpl* CommImpl::start() } else if ((src_actor_ != nullptr && src_actor_->is_suspended()) || (dst_actor_ != nullptr && dst_actor_->is_suspended())) { - /* If any of the process is suspended, create the synchro but stop its execution, - it will be restarted when the sender process resume */ + /* If any of the actor is suspended, create the synchro but stop its execution, + it will be restarted when the sender actor resume */ if (src_actor_->is_suspended()) XBT_DEBUG("The communication is suspended on startup because src (%s@%s) was suspended since it initiated the " "communication", @@ -355,8 +355,8 @@ void CommImpl::copy_data() return; XBT_DEBUG("Copying comm %p data from %s (%p) -> %s (%p) (%zu bytes)", this, - src_actor_ ? src_actor_->get_host()->get_cname() : "a finished process", src_buff_, - dst_actor_ ? dst_actor_->get_host()->get_cname() : "a finished process", dst_buff_, buff_size); + src_actor_ ? src_actor_->get_host()->get_cname() : "a finished actor", src_buff_, + dst_actor_ ? dst_actor_->get_host()->get_cname() : "a finished actor", dst_buff_, buff_size); /* Copy at most dst_buff_size bytes of the message to receiver's buffer */ if (dst_buff_size_) { @@ -412,7 +412,7 @@ void CommImpl::wait_for(actor::ActorImpl* issuer, double timeout) if (state_ != State::WAITING && state_ != State::RUNNING) { finish(); } else { /* we need a sleep action (even when there is no timeout) to be notified of host failures */ - resource::Action* sleep = issuer->get_host()->pimpl_cpu->sleep(timeout); + resource::Action* sleep = issuer->get_host()->get_cpu()->sleep(timeout); sleep->set_activity(this); if (issuer == src_actor_) @@ -422,7 +422,7 @@ void CommImpl::wait_for(actor::ActorImpl* issuer, double timeout) } } -int CommImpl::test_any(const actor::ActorImpl* issuer, const std::vector& comms) +ssize_t CommImpl::test_any(const actor::ActorImpl* issuer, const std::vector& comms) { if (MC_is_active() || MC_record_replay_is_active()) { int idx = issuer->simcall_.mc_value_; @@ -453,7 +453,7 @@ void CommImpl::wait_any_for(actor::ActorImpl* issuer, const std::vectorsimcall_.timeout_cb_ = nullptr; } else { - issuer->simcall_.timeout_cb_ = simix::Timer::set(SIMIX_get_clock() + timeout, [issuer, comms]() { + issuer->simcall_.timeout_cb_ = timer::Timer::set(s4u::Engine::get_clock() + timeout, [issuer, comms]() { // FIXME: Vector `comms' is copied here. Use a reference once its lifetime is extended (i.e. when the simcall is // modernized). issuer->simcall_.timeout_cb_ = nullptr; @@ -579,10 +579,8 @@ void CommImpl::finish() simcall->timeout_cb_ = nullptr; } if (not MC_is_active() && not MC_record_replay_is_active()) { - CommImpl** comms = simcall_comm_waitany__get__comms(simcall); - size_t count = simcall_comm_waitany__get__count(simcall); CommImpl** element = std::find(comms, comms + count, this); - int rank = (element != comms + count) ? element - comms : -1; + ssize_t rank = (element != comms + count) ? element - comms : -1; simcall_comm_waitany__set__result(simcall, rank); } } @@ -593,6 +591,10 @@ void CommImpl::finish() simcall->issuer_->context_->set_wannadie(); } else { switch (state_) { + case State::FAILED: + simcall->issuer_->exception_ = + std::make_exception_ptr(NetworkFailureException(XBT_THROW_POINT, "Remote peer failed")); + break; case State::SRC_TIMEOUT: simcall->issuer_->exception_ = std::make_exception_ptr( TimeoutException(XBT_THROW_POINT, "Communication timeouted because of the sender")); @@ -606,17 +608,21 @@ void CommImpl::finish() case State::SRC_HOST_FAILURE: if (simcall->issuer_ == src_actor_) simcall->issuer_->context_->set_wannadie(); - else + else { + state_ = kernel::activity::State::FAILED; simcall->issuer_->exception_ = std::make_exception_ptr(NetworkFailureException(XBT_THROW_POINT, "Remote peer failed")); + } break; case State::DST_HOST_FAILURE: if (simcall->issuer_ == dst_actor_) simcall->issuer_->context_->set_wannadie(); - else + else { + state_ = kernel::activity::State::FAILED; simcall->issuer_->exception_ = std::make_exception_ptr(NetworkFailureException(XBT_THROW_POINT, "Remote peer failed")); + } break; case State::LINK_FAILURE: @@ -632,6 +638,7 @@ void CommImpl::finish() } else { XBT_DEBUG("I'm neither source nor dest"); } + state_ = kernel::activity::State::FAILED; simcall->issuer_->throw_exception( std::make_exception_ptr(NetworkFailureException(XBT_THROW_POINT, "Link failure"))); break; @@ -666,7 +673,7 @@ void CommImpl::finish() count = simcall_comm_testany__get__count(simcall); } CommImpl** element = std::find(comms, comms + count, this); - int rank = (element != comms + count) ? element - comms : -1; + ssize_t rank = (element != comms + count) ? element - comms : -1; // In order to modify the exception we have to rethrow it: try { std::rethrow_exception(simcall->issuer_->exception_);