X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f84f3502c6a8cd6ea533bbaacc67c55588b2fbcb..c3c8a4edb0c9e5ac9d67f20ac2139845d727c79b:/src/kernel/activity/CommImpl.cpp diff --git a/src/kernel/activity/CommImpl.cpp b/src/kernel/activity/CommImpl.cpp index 820d15dcbb..5b5582ce4b 100644 --- a/src/kernel/activity/CommImpl.cpp +++ b/src/kernel/activity/CommImpl.cpp @@ -223,59 +223,24 @@ void simcall_HANDLER_comm_wait(smx_simcall_t simcall, simgrid::kernel::activity: } } -void simcall_HANDLER_comm_test(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl* comm) +bool simcall_HANDLER_comm_test(smx_simcall_t, simgrid::kernel::activity::CommImpl* comm) { - bool res; - - if (MC_is_active() || MC_record_replay_is_active()) { - res = comm->src_actor_ && comm->dst_actor_; - if (res) - comm->state_ = simgrid::kernel::activity::State::DONE; - } else { - res = comm->state_ != simgrid::kernel::activity::State::WAITING && - comm->state_ != simgrid::kernel::activity::State::RUNNING; - } - - simcall_comm_test__set__result(simcall, res); - if (res) { - comm->simcalls_.push_back(simcall); - comm->finish(); - } else { - simcall->issuer_->simcall_answer(); - } + return comm->test(); } -void simcall_HANDLER_comm_testany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl* comms[], size_t count) +int simcall_HANDLER_comm_testany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl* comms[], size_t count) { - // The default result is -1 -- this means, "nothing is ready". - // It can be changed below, but only if something matches. - simcall_comm_testany__set__result(simcall, -1); - if (MC_is_active() || MC_record_replay_is_active()) { int idx = simcall->mc_value_; - if (idx == -1) { - simcall->issuer_->simcall_answer(); - } else { - simgrid::kernel::activity::CommImpl* comm = comms[idx]; - simcall_comm_testany__set__result(simcall, idx); - comm->simcalls_.push_back(simcall); - comm->state_ = simgrid::kernel::activity::State::DONE; - comm->finish(); - } - return; + xbt_assert(idx == -1 || comms[idx]->test()); + return idx; } for (std::size_t i = 0; i != count; ++i) { - simgrid::kernel::activity::CommImpl* comm = comms[i]; - if (comm->state_ != simgrid::kernel::activity::State::WAITING && - comm->state_ != simgrid::kernel::activity::State::RUNNING) { - simcall_comm_testany__set__result(simcall, i); - comm->simcalls_.push_back(simcall); - comm->finish(); - return; - } + if (comms[i]->test()) + return i; } - simcall->issuer_->simcall_answer(); + return -1; } static void SIMIX_waitany_remove_simcall_from_actions(smx_simcall_t simcall) @@ -500,6 +465,13 @@ void CommImpl::copy_data() copied_ = true; } +bool CommImpl::test() +{ + if ((MC_is_active() || MC_record_replay_is_active()) && src_actor_ && dst_actor_) + state_ = State::DONE; + return ActivityImpl::test(); +} + void CommImpl::suspend() { /* FIXME: shall we suspend also the timeout synchro? */