From: Arnaud Giersch Date: Mon, 12 Apr 2021 21:08:40 +0000 (+0200) Subject: Define CommImpl::wait_for(). X-Git-Tag: v3.28~455^2~66 X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/f1fb146755cfc11953f1572b46ccebe3e10fb8e5 Define CommImpl::wait_for(). --- diff --git a/src/kernel/activity/ActivityImpl.hpp b/src/kernel/activity/ActivityImpl.hpp index 68fe1ef634..08745c0425 100644 --- a/src/kernel/activity/ActivityImpl.hpp +++ b/src/kernel/activity/ActivityImpl.hpp @@ -47,7 +47,7 @@ public: const char* get_cname() const { return name_.c_str(); } virtual bool test(); - void wait_for(actor::ActorImpl* issuer, double timeout); + virtual void wait_for(actor::ActorImpl* issuer, double timeout); virtual ActivityImpl& set_timeout(double) { THROW_UNIMPLEMENTED; } virtual void suspend(); diff --git a/src/kernel/activity/CommImpl.cpp b/src/kernel/activity/CommImpl.cpp index f61f3ec2d2..faf9eecafc 100644 --- a/src/kernel/activity/CommImpl.cpp +++ b/src/kernel/activity/CommImpl.cpp @@ -27,7 +27,7 @@ XBT_PRIVATE void simcall_HANDLER_comm_send(smx_simcall_t simcall, smx_actor_t sr simgrid::kernel::activity::ActivityImplPtr comm = simcall_HANDLER_comm_isend( simcall, src, mbox, task_size, rate, src_buff, src_buff_size, match_fun, nullptr, copy_data_fun, data, false); simcall->mc_value_ = 0; - simcall_HANDLER_comm_wait(simcall, static_cast(comm.get()), timeout); + comm->wait_for(simcall->issuer_, timeout); } XBT_PRIVATE simgrid::kernel::activity::ActivityImplPtr simcall_HANDLER_comm_isend( @@ -104,7 +104,7 @@ XBT_PRIVATE void simcall_HANDLER_comm_recv(smx_simcall_t simcall, smx_actor_t re simgrid::kernel::activity::ActivityImplPtr comm = simcall_HANDLER_comm_irecv( simcall, receiver, mbox, dst_buff, dst_buff_size, match_fun, copy_data_fun, data, rate); simcall->mc_value_ = 0; - simcall_HANDLER_comm_wait(simcall, static_cast(comm.get()), timeout); + comm->wait_for(simcall->issuer_, timeout); } XBT_PRIVATE simgrid::kernel::activity::ActivityImplPtr @@ -182,45 +182,7 @@ simcall_HANDLER_comm_irecv(smx_simcall_t /*simcall*/, smx_actor_t receiver, smx_ void simcall_HANDLER_comm_wait(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl* comm, double timeout) { - /* Associate this simcall to the wait synchro */ - XBT_DEBUG("simcall_HANDLER_comm_wait, %p", comm); - - comm->register_simcall(simcall); - - if (MC_is_active() || MC_record_replay_is_active()) { - int idx = simcall->mc_value_; - if (idx == 0) { - comm->state_ = simgrid::kernel::activity::State::DONE; - } else { - /* If we reached this point, the wait simcall must have a timeout */ - /* Otherwise it shouldn't be enabled and executed by the MC */ - if (timeout < 0.0) - THROW_IMPOSSIBLE; - - if (comm->src_actor_ == simcall->issuer_) - comm->state_ = simgrid::kernel::activity::State::SRC_TIMEOUT; - else - comm->state_ = simgrid::kernel::activity::State::DST_TIMEOUT; - } - - comm->finish(); - return; - } - - /* If the synchro has already finish perform the error handling, */ - /* otherwise set up a waiting timeout on the right side */ - if (comm->state_ != simgrid::kernel::activity::State::WAITING && - comm->state_ != simgrid::kernel::activity::State::RUNNING) { - comm->finish(); - } else { /* we need a sleep action (even when there is no timeout) to be notified of host failures */ - simgrid::kernel::resource::Action* sleep = simcall->issuer_->get_host()->pimpl_cpu->sleep(timeout); - sleep->set_activity(comm); - - if (simcall->issuer_ == comm->src_actor_) - comm->src_timeout_ = sleep; - else - comm->dst_timeout_ = sleep; - } + comm->wait_for(simcall->issuer_, timeout); } bool simcall_HANDLER_comm_test(smx_simcall_t, simgrid::kernel::activity::CommImpl* comm) @@ -423,6 +385,43 @@ bool CommImpl::test() return ActivityImpl::test(); } +void CommImpl::wait_for(actor::ActorImpl* issuer, double timeout) +{ + XBT_DEBUG("CommImpl::wait_for(%g), %p, state %s", timeout, this, to_c_str(state_)); + + /* Associate this simcall to the wait synchro */ + register_simcall(&issuer->simcall_); + + if (MC_is_active() || MC_record_replay_is_active()) { + int idx = issuer->simcall_.mc_value_; + if (idx == 0) { + state_ = State::DONE; + } else { + /* If we reached this point, the wait simcall must have a timeout */ + /* Otherwise it shouldn't be enabled and executed by the MC */ + if (timeout < 0.0) + THROW_IMPOSSIBLE; + state_ = (issuer == src_actor_ ? State::SRC_TIMEOUT : State::DST_TIMEOUT); + } + finish(); + return; + } + + /* If the synchro has already finish perform the error handling, */ + /* otherwise set up a waiting timeout on the right side */ + 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); + sleep->set_activity(this); + + if (issuer == src_actor_) + src_timeout_ = sleep; + else + dst_timeout_ = sleep; + } +} + int CommImpl::test_any(actor::ActorImpl* issuer, const std::vector& comms) { if (MC_is_active() || MC_record_replay_is_active()) { diff --git a/src/kernel/activity/CommImpl.hpp b/src/kernel/activity/CommImpl.hpp index 9421a94ac6..5f69a597b2 100644 --- a/src/kernel/activity/CommImpl.hpp +++ b/src/kernel/activity/CommImpl.hpp @@ -51,6 +51,7 @@ public: void copy_data(); bool test() override; + void wait_for(actor::ActorImpl* issuer, double timeout) override; static int test_any(actor::ActorImpl* issuer, const std::vector& comms); static void wait_any_for(actor::ActorImpl* issuer, const std::vector& comms, double timeout);