X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d57457e88961fcb4f30d180795e0a4862a35bb0e..b51da37243dc16575499f4cb7729fe8bdd7fa514:/src/simix/smx_network.cpp?ds=sidebyside diff --git a/src/simix/smx_network.cpp b/src/simix/smx_network.cpp index 0b47f73f02..25783eb9ad 100644 --- a/src/simix/smx_network.cpp +++ b/src/simix/smx_network.cpp @@ -478,12 +478,14 @@ void simcall_HANDLER_comm_testany( SIMIX_simcall_answer(simcall); } -void simcall_HANDLER_comm_waitany(smx_simcall_t simcall, xbt_dynar_t synchros) +void simcall_HANDLER_comm_waitany(smx_simcall_t simcall, xbt_dynar_t synchros, double timeout) { smx_synchro_t synchro; unsigned int cursor = 0; if (MC_is_active() || MC_record_replay_is_active()){ + if (timeout != -1) + xbt_die("Timeout not implemented for waitany in the model-checker"); int idx = SIMCALL_GET_MC_VALUE(simcall); synchro = xbt_dynar_get_as(synchros, idx, smx_synchro_t); synchro->simcalls.push_back(simcall); @@ -492,7 +494,17 @@ void simcall_HANDLER_comm_waitany(smx_simcall_t simcall, xbt_dynar_t synchros) SIMIX_comm_finish(synchro); return; } - + + if (timeout == -1 ){ + simcall->timer = NULL; + } else { + simcall->timer = SIMIX_timer_set(timeout, [simcall]() { + SIMIX_waitany_remove_simcall_from_actions(simcall); + simcall_comm_waitany__set__result(simcall, -1); + SIMIX_simcall_answer(simcall); + }); + } + xbt_dynar_foreach(synchros, cursor, synchro){ /* associate this simcall to the the synchro */ synchro->simcalls.push_back(simcall); @@ -584,6 +596,10 @@ void SIMIX_comm_finish(smx_synchro_t synchro) continue; // if process handling comm is killed if (simcall->call == SIMCALL_COMM_WAITANY) { SIMIX_waitany_remove_simcall_from_actions(simcall); + if (simcall->timer) { + SIMIX_timer_remove(simcall->timer); + simcall->timer = nullptr; + } if (!MC_is_active() && !MC_record_replay_is_active()) simcall_comm_waitany__set__result(simcall, xbt_dynar_search(simcall_comm_waitany__get__comms(simcall), &synchro)); }