req->issuer->waiting_action = action;
if (MC_IS_ENABLED){
- action->state = SIMIX_DONE;
+ if(action->comm.src_proc && action->comm.dst_proc){
+ action->state = SIMIX_DONE;
+ }else{
+ /* If we reached this point, the wait request must have a timeout */
+ /* Otherwise it shouldn't be enabled and executed by the MC */
+ if(timeout == -1)
+ THROW_IMPOSSIBLE;
+
+ if(action->comm.src_proc == req->issuer)
+ action->state = SIMIX_SRC_TIMEOUT;
+ else
+ action->state = SIMIX_DST_TIMEOUT;
+ }
+
SIMIX_comm_finish(action);
return;
}
SIMIX_rdv_remove(action->comm.rdv, action);
action->state = SIMIX_FAILED;
} else {
- surf_workstation_model->action_cancel(action->comm.surf_comm);
+ /* When running the MC there are no surf actions */
+ if(!MC_IS_ENABLED)
+ surf_workstation_model->action_cancel(action->comm.surf_comm);
}
}
case REQ_COMM_WAIT:
/* FIXME: check also that src and dst processes are not suspended */
+ /* If there is a timeout it will be always enabled because, if the
+ * communication is not ready, it can timeout.
+ * This avoids false positives on dead-locks */
+ if(req->comm_wait.timeout >= 0)
+ return TRUE;
+
act = req->comm_wait.comm;
return (act->comm.src_proc && act->comm.dst_proc);
break;
return FALSE;
break;
- case REQ_COMM_TEST:
- act = req->comm_test.comm;
- return (act->comm.src_proc && act->comm.dst_proc);
- break;
-
default:
return TRUE;
}