X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3ae3a4b85d0ac22efcbb06529150e90521008c9e..eb08fb3c624342be6f198555c0ebb0d847c65d65:/src/kernel/activity/ExecImpl.cpp diff --git a/src/kernel/activity/ExecImpl.cpp b/src/kernel/activity/ExecImpl.cpp index eda2b58c9f..76b136ff85 100644 --- a/src/kernel/activity/ExecImpl.cpp +++ b/src/kernel/activity/ExecImpl.cpp @@ -17,23 +17,36 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_process); -void simcall_HANDLER_execution_wait(smx_simcall_t simcall, simgrid::kernel::activity::ExecImpl* synchro) +void simcall_HANDLER_execution_wait(smx_simcall_t simcall, simgrid::kernel::activity::ExecImpl* synchro, double timeout) { XBT_DEBUG("Wait for execution of synchro %p, state %d", synchro, (int)synchro->state_); + xbt_assert(std::isfinite(timeout), "timeout is not finite!"); /* 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_ = simgrid::kernel::activity::State::DONE; + int idx = SIMCALL_GET_MC_VALUE(*simcall); + if (idx == 0) { + synchro->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; + synchro->state_ = simgrid::kernel::activity::State::TIMEOUT; + } synchro->finish(); return; } /* If the synchro is already finished then perform the error handling */ - if (synchro->state_ != simgrid::kernel::activity::State::RUNNING) + if (synchro->state_ != simgrid::kernel::activity::State::RUNNING) { synchro->finish(); + } else { /* we need a sleep action (even when there is no timeout) to be notified of host failures */ + synchro->set_timeout(timeout); + } } void simcall_HANDLER_execution_test(smx_simcall_t simcall, simgrid::kernel::activity::ExecImpl* synchro)