X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/334e868fd56cf359ef71557b7eba026687fbef73..c02558d70f9c62f9f5d04f1830be4cf16ca84bc0:/src/simix/SynchroSleep.cpp diff --git a/src/simix/SynchroSleep.cpp b/src/simix/SynchroSleep.cpp index 23959509e3..579f06d9a6 100644 --- a/src/simix/SynchroSleep.cpp +++ b/src/simix/SynchroSleep.cpp @@ -5,11 +5,56 @@ #include "src/simix/SynchroSleep.hpp" #include "src/surf/surf_interface.hpp" +#include "src/simix/popping_private.h" +#include "src/simix/smx_process_private.h" -void simgrid::simix::Sleep::suspend() { +XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_process); + +void simgrid::simix::Sleep::suspend() +{ surf_sleep->suspend(); } -void simgrid::simix::Sleep::resume() { +void simgrid::simix::Sleep::resume() +{ surf_sleep->resume(); } + +void simgrid::simix::Sleep::post() +{ + while (!simcalls.empty()) { + smx_simcall_t simcall = simcalls.front(); + simcalls.pop_front(); + + e_smx_state_t state; + switch (surf_sleep->getState()){ + case simgrid::surf::Action::State::failed: + simcall->issuer->context->iwannadie = 1; + //SMX_EXCEPTION(simcall->issuer, host_error, 0, "Host failed"); + state = SIMIX_SRC_HOST_FAILURE; + break; + + case simgrid::surf::Action::State::done: + state = SIMIX_DONE; + break; + + default: + THROW_IMPOSSIBLE; + break; + } + if (simcall->issuer->host->isOff()) { + simcall->issuer->context->iwannadie = 1; + } + simcall_process_sleep__set__result(simcall, state); + simcall->issuer->waiting_synchro = NULL; + if (simcall->issuer->suspended) { + XBT_DEBUG("Wait! This process is suspended and can't wake up now."); + simcall->issuer->suspended = 0; + simcall_HANDLER_process_suspend(simcall, simcall->issuer); + } else { + SIMIX_simcall_answer(simcall); + } + } + + SIMIX_process_sleep_destroy(this); +}