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)
XBT_PRIVATE void simcall_HANDLER_comm_send(smx_simcall_t simcall, smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, unsigned char* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double timeout);
XBT_PRIVATE boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl> simcall_HANDLER_comm_isend(smx_simcall_t simcall, smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, unsigned char* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_clean_func_t clean_fun, simix_copy_data_func_t copy_data_fun, void* data, bool detached);
XBT_PRIVATE bool simcall_HANDLER_comm_test(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl* comm);
-XBT_PRIVATE void simcall_HANDLER_comm_testany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl** comms, size_t count);
+XBT_PRIVATE int simcall_HANDLER_comm_testany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl** comms, size_t count);
XBT_PRIVATE void simcall_HANDLER_comm_waitany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl** comms, size_t count, double timeout);
XBT_PRIVATE void simcall_HANDLER_comm_wait(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl* comm, double timeout);
break;
case Simcall::COMM_TESTANY:
- simcall_HANDLER_comm_testany(&simcall_, simgrid::simix::unmarshal<simgrid::kernel::activity::CommImpl**>(simcall_.args_[0]), simgrid::simix::unmarshal<size_t>(simcall_.args_[1]));
+ simgrid::simix::marshal<int>(simcall_.result_, simcall_HANDLER_comm_testany(&simcall_, simgrid::simix::unmarshal<simgrid::kernel::activity::CommImpl**>(simcall_.args_[0]), simgrid::simix::unmarshal<size_t>(simcall_.args_[1])));
+ simcall_answer();
break;
case Simcall::COMM_WAITANY:
void comm_send(smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, unsigned char* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double timeout) [[block]];
boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl> comm_isend(smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, unsigned char* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_clean_func_t clean_fun, simix_copy_data_func_t copy_data_fun, void* data, bool detached);
bool comm_test(simgrid::kernel::activity::CommImpl* comm);
-int comm_testany(simgrid::kernel::activity::CommImpl** comms, size_t count) [[block]];
+int comm_testany(simgrid::kernel::activity::CommImpl** comms, size_t count);
int comm_waitany(simgrid::kernel::activity::CommImpl** comms, size_t count, double timeout) [[block]];
void comm_wait(simgrid::kernel::activity::CommImpl* comm, double timeout) [[block]];