From fe3f93cc16d6505056d5d5dc8fb63dbea26b9ef2 Mon Sep 17 00:00:00 2001 From: cristianrosa Date: Wed, 26 Jan 2011 13:54:33 +0000 Subject: [PATCH] Bugfix: return testany requests' result when they succeed on MC mode. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@9505 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/mc/mc_request.c | 31 ++++++++++++++++++++----------- src/mc/mc_state.c | 10 +++------- src/simix/smx_network.c | 1 + 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/mc/mc_request.c b/src/mc/mc_request.c index f9b8f47d14..07238b862d 100644 --- a/src/mc/mc_request.c +++ b/src/mc/mc_request.c @@ -69,8 +69,6 @@ int MC_request_depend(smx_req_t r1, smx_req_t r2) && r1->comm_irecv.rdv != r2->comm_irecv.rdv) return FALSE; - /* If any of the request is a timeout wait, and it reached - * this point, it won't be dependent with any other request. */ if(r1->call == REQ_COMM_WAIT && (r2->call == REQ_COMM_WAIT || r2->call == REQ_COMM_TEST) && (r1->comm_wait.comm->comm.src_proc == NULL || r1->comm_wait.comm->comm.dst_proc == NULL)) @@ -180,23 +178,29 @@ char *MC_request_to_string(smx_req_t req, int value) args = bprintf("comm=%p", act); }else{ type = bprintf("Test TRUE"); - args = bprintf("comm=%p [%s -> %s]", act, - act->comm.src_proc ? act->comm.src_proc->name : "", - act->comm.dst_proc ? act->comm.dst_proc->name : ""); + args = bprintf("comm=%p [(%lu)%s -> (%lu)%s]", act, + act->comm.src_proc ? act->comm.src_proc->pid : 0, + act->comm.src_proc ? act->comm.src_proc->name : "", + act->comm.dst_proc ? act->comm.dst_proc->pid : 0, + act->comm.dst_proc ? act->comm.dst_proc->name : ""); } break; case REQ_COMM_WAITANY: type = bprintf("WaitAny"); - args = bprintf("-"); - /* FIXME: improve output */ + args = bprintf("comm=%p (%d of %lu)", xbt_dynar_get_as(req->comm_waitany.comms, value, smx_action_t), + value+1, xbt_dynar_length(req->comm_waitany.comms)); break; case REQ_COMM_TESTANY: - type = bprintf("TestAny"); - args = bprintf("-"); - /* FIXME: improve output */ - break; + if(value == -1){ + type = bprintf("TestAny FALSE"); + args = bprintf("-"); + }else{ + type = bprintf("TestAny"); + args = bprintf("(%d of %lu)", value+1, xbt_dynar_length(req->comm_testany.comms)); + } + break; default: THROW_UNIMPLEMENTED; @@ -285,6 +289,11 @@ int MC_request_is_enabled_by_idx(smx_req_t req, unsigned int idx) return (act->comm.src_proc && act->comm.dst_proc); break; + case REQ_COMM_TESTANY: + act = xbt_dynar_get_as(req->comm_testany.comms, idx, smx_action_t); + return (act->comm.src_proc && act->comm.dst_proc); + break; + default: return TRUE; } diff --git a/src/mc/mc_state.c b/src/mc/mc_state.c index 46f6d6c93f..fa88d39797 100644 --- a/src/mc/mc_state.c +++ b/src/mc/mc_state.c @@ -112,7 +112,7 @@ smx_req_t MC_state_get_request(mc_state_t state, int *value) { smx_process_t process = NULL; mc_procstate_t procstate = NULL; - + unsigned int start_count; xbt_swag_foreach(process, simix_global->process_list){ procstate = &state->proc_status[process->pid]; @@ -138,12 +138,8 @@ smx_req_t MC_state_get_request(mc_state_t state, int *value) break; case REQ_COMM_TESTANY: + start_count = procstate->interleave_count; *value = -1; - if(MC_request_testany_fail(&process->request)){ - procstate->state = MC_DONE; - return &process->request; - } - while(procstate->interleave_count < xbt_dynar_length(process->request.comm_testany.comms)){ if(MC_request_is_enabled_by_idx(&process->request, procstate->interleave_count++)){ *value = procstate->interleave_count - 1; @@ -154,7 +150,7 @@ smx_req_t MC_state_get_request(mc_state_t state, int *value) if(procstate->interleave_count >= xbt_dynar_length(process->request.comm_testany.comms)) procstate->state = MC_DONE; - if(*value != -1) + if(*value != -1 || start_count == 0) return &process->request; break; diff --git a/src/simix/smx_network.c b/src/simix/smx_network.c index 641fac3e4e..aa46dc3450 100644 --- a/src/simix/smx_network.c +++ b/src/simix/smx_network.c @@ -396,6 +396,7 @@ void SIMIX_pre_comm_testany(smx_req_t req, int idx) SIMIX_request_answer(req); }else{ action = xbt_dynar_get_as(actions, idx, smx_action_t); + req->comm_testany.result = idx; xbt_fifo_push(action->request_list, req); action->state = SIMIX_DONE; SIMIX_comm_finish(action); -- 2.20.1