X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/bbfde1ef5427e4e7e84ca8d38aff13507947c194..df5df0237e75d63eff440fcf30b8760c24ab948a:/src/mc/mc_transition.c diff --git a/src/mc/mc_transition.c b/src/mc/mc_transition.c index 5baeb9ea7a..3d37e46e54 100644 --- a/src/mc/mc_transition.c +++ b/src/mc/mc_transition.c @@ -1,5 +1,8 @@ #include "private.h" +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_trans, mc, + "Logging specific to MC transitions"); + /* Creates a new iSend transition */ mc_transition_t MC_trans_isend_new(smx_rdv_t rdv) { @@ -66,20 +69,29 @@ mc_transition_t MC_trans_waitany_new(xbt_dynar_t comms) } /* Creates a new Random transition */ -mc_transition_t MC_trans_random_new(int min, int max) +mc_transition_t MC_trans_random_new(int value) { mc_transition_t trans = xbt_new0(s_mc_transition_t, 1); trans->type = mc_random; trans->process = SIMIX_process_self(); - trans->random.min = min; - trans->random.max = max; - trans->random.current_value = min; - trans->name = bprintf("[%s][%s] Random (%p)", trans->process->smx_host->name, - trans->process->name, trans); + trans->random.value = value; + trans->name = bprintf("[%s][%s] Random %d (%p)", trans->process->smx_host->name, + trans->process->name, value, trans); + return trans; } +/** + * \brief Deletes a transition + * \param trans The transition to be deleted + */ +void MC_transition_delete(mc_transition_t trans) +{ + xbt_free(trans->name); + xbt_free(trans); +} + /************************** Interception Functions ****************************/ /* These functions intercept all the actions relevant to the model-checking * process, the only difference between them is the type of transition they @@ -177,15 +189,20 @@ void MC_trans_intercept_test(smx_comm_t comm) */ void MC_trans_intercept_waitany(xbt_dynar_t comms) { - mc_transition_t trans=NULL; + unsigned int cursor; + mc_transition_t trans = NULL; mc_state_t current_state = NULL; + smx_comm_t comm = NULL; + if(!mc_replay_mode){ MC_SET_RAW_MEM; - trans = MC_trans_waitany_new(comms); current_state = (mc_state_t) xbt_fifo_get_item_content(xbt_fifo_get_first_item(mc_stack)); - xbt_setset_set_insert(current_state->created_transitions, trans); - xbt_setset_set_insert(current_state->transitions, trans); + xbt_dynar_foreach(comms, cursor, comm){ + trans = MC_trans_wait_new(comm); + xbt_setset_set_insert(current_state->created_transitions, trans); + xbt_setset_set_insert(current_state->transitions, trans); + } MC_UNSET_RAW_MEM; } SIMIX_process_yield(); @@ -198,42 +215,59 @@ void MC_trans_intercept_waitany(xbt_dynar_t comms) */ void MC_trans_intercept_random(int min, int max) { + int i; mc_transition_t trans=NULL; mc_state_t current_state = NULL; if(!mc_replay_mode){ MC_SET_RAW_MEM; - trans = MC_trans_random_new(min, max); current_state = (mc_state_t) xbt_fifo_get_item_content(xbt_fifo_get_first_item(mc_stack)); - xbt_setset_set_insert(current_state->created_transitions, trans); - xbt_setset_set_insert(current_state->transitions, trans); + for(i=min; i <= max; i++){ + trans = MC_trans_random_new(i); + xbt_setset_set_insert(current_state->created_transitions, trans); + xbt_setset_set_insert(current_state->transitions, trans); + } MC_UNSET_RAW_MEM; } SIMIX_process_yield(); } -/** - * \brief Deletes a transition - * \param trans The transition to be deleted - */ -void MC_transition_delete(mc_transition_t trans) -{ - xbt_free(trans->name); - xbt_free(trans); -} - /* Compute the subset of enabled transitions of the transition set */ void MC_trans_compute_enabled(xbt_setset_set_t enabled, xbt_setset_set_t transitions) { + unsigned int index = 0; + smx_comm_t comm = NULL; mc_transition_t trans = NULL; xbt_setset_cursor_t cursor = NULL; - /* Add all the transitions to the enabled set and then remove the disabled ones */ - xbt_setset_add(enabled, transitions); xbt_setset_foreach(transitions, cursor, trans){ - if(trans->type == mc_wait - && (trans->wait.comm->src_proc == NULL || trans->wait.comm->dst_proc == NULL)){ - xbt_setset_set_remove(enabled, trans); - } + switch(trans->type){ + /* Wait transitions are enabled only if the communication has both a + sender and receiver */ + case mc_wait: + if(trans->wait.comm->src_proc && trans->wait.comm->dst_proc){ + xbt_setset_set_insert(enabled, trans); + DEBUG1("Transition %p is enabled for next state", trans); + } + break; + + /* WaitAny transitions are enabled if any of it's communications has both + a sender and a receiver */ + case mc_waitany: + xbt_dynar_foreach(trans->waitany.comms, index, comm){ + if(comm->src_proc && comm->dst_proc){ + xbt_setset_set_insert(enabled, trans); + DEBUG1("Transition %p is enabled for next state", trans); + break; + } + } + break; + + /* The rest of the transitions cannot be disabled */ + default: + xbt_setset_set_insert(enabled, trans); + DEBUG1("Transition %p is enabled for next state", trans); + break; + } } } @@ -250,6 +284,9 @@ int MC_transition_depend(mc_transition_t t1, mc_transition_t t2) if(t1->type != t2->type) return FALSE; + + if(t1->type == mc_random || t2->type == mc_random) + return FALSE; if(t1->type == mc_isend && t2->type == mc_isend && t1->isend.rdv != t2->isend.rdv) return FALSE;