-void simcall_HANDLER_execution_wait(smx_simcall_t simcall, simgrid::kernel::activity::ExecImpl* synchro)
-{
- XBT_DEBUG("Wait for execution of synchro %p, state %d", synchro, (int)synchro->state_);
-
- /* Associate this simcall to the synchro */
- synchro->register_simcall(simcall);
-
- /* set surf's synchro */
- if (MC_is_active() || MC_record_replay_is_active()) {
- synchro->state_ = SIMIX_DONE;
- synchro->finish();
- return;
- }
-
- /* If the synchro is already finished then perform the error handling */
- if (synchro->state_ != SIMIX_RUNNING)
- synchro->finish();
-}
-
-void simcall_HANDLER_execution_test(smx_simcall_t simcall, simgrid::kernel::activity::ExecImpl* synchro)
-{
- bool res = (synchro->state_ != SIMIX_WAITING && synchro->state_ != SIMIX_RUNNING);
- if (res) {
- synchro->simcalls_.push_back(simcall);
- synchro->finish();
- } else {
- simcall->issuer_->simcall_answer();
- }
- simcall_execution_test__set__result(simcall, res);
-}
-
-void simcall_HANDLER_execution_waitany_for(smx_simcall_t simcall, simgrid::kernel::activity::ExecImpl* execs[],
- size_t count, double timeout)
-{
- if (timeout < 0.0) {
- simcall->timeout_cb_ = nullptr;
- } else {
- simcall->timeout_cb_ = simgrid::simix::Timer::set(SIMIX_get_clock() + timeout, [simcall, execs, count]() {
- for (size_t i = 0; i < count; i++) {
- // Remove the first occurence of simcall:
- auto* exec = execs[i];
- auto j = boost::range::find(exec->simcalls_, simcall);
- if (j != exec->simcalls_.end())
- exec->simcalls_.erase(j);
- }
- simcall_execution_waitany_for__set__result(simcall, -1);
- simcall->issuer_->simcall_answer();
- });
- }
-
- for (size_t i = 0; i < count; i++) {
- /* associate this simcall to the the synchro */
- auto* exec = execs[i];
- exec->simcalls_.push_back(simcall);
-
- /* see if the synchro is already finished */
- if (exec->state_ != SIMIX_WAITING && exec->state_ != SIMIX_RUNNING) {
- exec->finish();
- break;
- }
- }
-}
-