if (mbox->permanent_receiver!=nullptr){
//this mailbox is for small messages, which have to be sent right now
other_synchro->state = SIMIX_READY;
- other_comm->dst_proc=mbox->permanent_receiver;
+ other_comm->dst_proc=mbox->permanent_receiver.get();
other_comm->ref();
mbox->done_comm_queue->push_back(other_synchro);
other_comm->mbox=mbox;
{
unsigned int cursor;
smx_synchro_t synchro;
+ // 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()){
}
/* if there is an exception during a waitany or a testany, indicate the position of the failed communication */
- if (simcall->issuer->doexception) {
- if (simcall->call == SIMCALL_COMM_WAITANY) {
- simcall->issuer->running_ctx->exception.value = xbt_dynar_search(simcall_comm_waitany__get__comms(simcall), &synchro);
+ if (simcall->issuer->exception) {
+ // In order to modify the exception we have to rethrow it:
+ try {
+ std::rethrow_exception(simcall->issuer->exception);
}
- else if (simcall->call == SIMCALL_COMM_TESTANY) {
- simcall->issuer->running_ctx->exception.value = xbt_dynar_search(simcall_comm_testany__get__comms(simcall), &synchro);
+ catch(xbt_ex& e) {
+ if (simcall->call == SIMCALL_COMM_WAITANY) {
+ e.value = xbt_dynar_search(simcall_comm_waitany__get__comms(simcall), &synchro);
+ }
+ else if (simcall->call == SIMCALL_COMM_TESTANY) {
+ e.value = xbt_dynar_search(simcall_comm_testany__get__comms(simcall), &synchro);
+ }
+ simcall->issuer->exception = std::make_exception_ptr(e);
+ }
+ catch(...) {
+ // Nothing to do
}
}