X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/62dd6184baa87113d6bd7f536ac31196ad162945..d034a28c8e76a4f17219f931ef95382572225c4b:/src/simix/smx_network.c diff --git a/src/simix/smx_network.c b/src/simix/smx_network.c index c5a62db9b3..8280532477 100644 --- a/src/simix/smx_network.c +++ b/src/simix/smx_network.c @@ -51,8 +51,8 @@ smx_rdv_t SIMIX_rdv_create(const char *name) rdv->name = name ? xbt_strdup(name) : NULL; rdv->comm_fifo = xbt_fifo_new(); - if (name) - xbt_dict_set(rdv_points, name, rdv, SIMIX_rdv_free); + if (rdv->name) + xbt_dict_set(rdv_points, rdv->name, rdv, SIMIX_rdv_free); } return rdv; } @@ -60,7 +60,7 @@ smx_rdv_t SIMIX_rdv_create(const char *name) void SIMIX_rdv_destroy(smx_rdv_t rdv) { if (rdv->name) - xbt_dict_remove(rdv_points, rdv->name); + xbt_dict_remove(rdv_points, rdv->name); } void SIMIX_rdv_free(void *data) @@ -326,7 +326,20 @@ void SIMIX_pre_comm_wait(smx_req_t req) 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; } @@ -359,11 +372,25 @@ void SIMIX_pre_comm_test(smx_req_t req) } } -void SIMIX_pre_comm_testany(smx_req_t req) +void SIMIX_pre_comm_testany(smx_req_t req, unsigned int idx) { unsigned int cursor; smx_action_t action; + xbt_dynar_t actions = req->comm_testany.comms; req->comm_testany.result = -1; + + if (MC_IS_ENABLED){ + if((int)idx == -1){ + SIMIX_request_answer(req); + }else{ + action = xbt_dynar_get_as(actions, idx, smx_action_t); + xbt_fifo_push(action->request_list, req); + action->state = SIMIX_DONE; + SIMIX_comm_finish(action); + } + return; + } + xbt_dynar_foreach(req->comm_testany.comms,cursor,action) { if (action->state != SIMIX_WAITING && action->state != SIMIX_RUNNING) { req->comm_testany.result = cursor; @@ -375,11 +402,21 @@ void SIMIX_pre_comm_testany(smx_req_t req) SIMIX_request_answer(req); } -void SIMIX_pre_comm_waitany(smx_req_t req) +void SIMIX_pre_comm_waitany(smx_req_t req, unsigned int idx) { smx_action_t action; unsigned int cursor = 0; xbt_dynar_t actions = req->comm_waitany.comms; + + if (MC_IS_ENABLED){ + action = xbt_dynar_get_as(actions, idx, smx_action_t); + xbt_fifo_push(action->request_list, req); + req->comm_waitany.result = idx; + action->state = SIMIX_DONE; + SIMIX_comm_finish(action); + return; + } + xbt_dynar_foreach(actions, cursor, action){ /* Associate this request to the action */ xbt_fifo_push(action->request_list, req); @@ -456,7 +493,8 @@ void SIMIX_comm_finish(smx_action_t action) return it as the result of the call */ if (req->call == REQ_COMM_WAITANY) { SIMIX_waitany_req_remove_from_actions(req); - req->comm_waitany.result = xbt_dynar_search(req->comm_waitany.comms, &action); + if(!MC_IS_ENABLED) + req->comm_waitany.result = xbt_dynar_search(req->comm_waitany.comms, &action); } /* If the action is still in a rendez-vous point then remove from it */ @@ -586,7 +624,9 @@ void SIMIX_comm_cancel(smx_action_t action) 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); } }