void SIMIX_pre_comm_waitany(smx_req_t req);
void SIMIX_post_comm(smx_action_t action);
void SIMIX_pre_comm_test(smx_req_t req);
+void SIMIX_pre_comm_testany(smx_req_t req);
void SIMIX_comm_cancel(smx_action_t action);
double SIMIX_comm_get_remains(smx_action_t action);
e_smx_state_t SIMIX_comm_get_state(smx_action_t action);
REQ_COMM_WAITANY,
REQ_COMM_WAIT,
REQ_COMM_TEST,
+ REQ_COMM_TESTANY,
REQ_COMM_GET_REMAINS,
REQ_COMM_GET_STATE,
REQ_COMM_GET_DATA,
int result;
} comm_test;
+ struct {
+ xbt_dynar_t comms;
+ int result;
+ } comm_testany;
+
struct {
smx_action_t comm;
double result;
}
}
+void SIMIX_pre_comm_testany(smx_req_t req)
+{
+ unsigned int cursor;
+ smx_action_t action;
+ req->comm_testany.result = -1;
+ xbt_dynar_foreach(req->comm_testany.comms,cursor,action) {
+ if (action->state != SIMIX_WAITING && action->state != SIMIX_RUNNING) {
+ req->comm_testany.result = cursor;
+ xbt_fifo_push(action->request_list, req);
+ SIMIX_comm_finish(action);
+ break;
+ }
+ }
+ SIMIX_request_answer(req);
+}
+
void SIMIX_pre_comm_waitany(smx_req_t req)
{
smx_action_t action;
SIMIX_pre_comm_test(req);
break;
+ case REQ_COMM_TESTANY:
+ SIMIX_pre_comm_testany(req);
+ break;
+
case REQ_COMM_GET_REMAINS:
req->comm_get_remains.result =
SIMIX_comm_get_remains(req->comm_get_remains.comm);
if (xbt_dynar_length(comms)==0)
return -1;
- WARN0("SIMIX_comm_testany is not implemented yet. Using waitany instead. This changes the semantic...");
- req.call = REQ_COMM_WAITANY;
- req.comm_waitany.comms = comms;
+ req.call = REQ_COMM_TESTANY;
+ req.comm_testany.comms = comms;
SIMIX_request_push(&req);
- return req.comm_waitany.result;
+ return req.comm_testany.result;
}
void SIMIX_req_comm_wait(smx_action_t comm, double timeout)