X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e13dac70099e758d38fc15778b6f427139c981bb..a7a65bd1066880ac5876add26720aad9634c1e0e:/src/mc/mc_dpor.c diff --git a/src/mc/mc_dpor.c b/src/mc/mc_dpor.c index a54411d083..11cc06c7c3 100644 --- a/src/mc/mc_dpor.c +++ b/src/mc/mc_dpor.c @@ -14,7 +14,7 @@ static int is_visited_state(void); static int is_visited_state(){ - if(_surf_mc_visited == 0) + if(_sg_mc_visited == 0) return 0; int raw_mem_set = (mmalloc_get_current_heap() == raw_heap); @@ -57,7 +57,7 @@ static int is_visited_state(){ } } - if(xbt_dynar_length(visited_states) == _surf_mc_visited){ + if(xbt_dynar_length(visited_states) == _sg_mc_visited){ mc_snapshot_t state_to_remove = NULL; xbt_dynar_shift(visited_states, &state_to_remove); MC_free_snapshot(state_to_remove); @@ -106,7 +106,7 @@ void MC_dpor_init() xbt_swag_foreach(process, simix_global->process_list){ if(MC_process_is_enabled(process)){ MC_state_interleave_process(initial_state, process); - break; + XBT_DEBUG("Process %lu enabled with simcall %d", process->pid, process->simcall.call); } } @@ -132,10 +132,12 @@ void MC_dpor(void) char *req_str; int value; smx_simcall_t req = NULL, prev_req = NULL; + s_smx_simcall_t req2; mc_state_t state = NULL, prev_state = NULL, next_state = NULL, restore_state=NULL; smx_process_t process = NULL; xbt_fifo_item_t item = NULL; - int pos; + int pos, i; + int interleave_proc[simix_process_maxpid]; while (xbt_fifo_size(mc_stack_safety) > 0) { @@ -153,7 +155,7 @@ void MC_dpor(void) /* If there are processes to interleave and the maximum depth has not been reached then perform one step of the exploration algorithm */ - if (xbt_fifo_size(mc_stack_safety) < _surf_mc_max_depth && + if (xbt_fifo_size(mc_stack_safety) < _sg_mc_max_depth && (req = MC_state_get_request(state, &value))) { /* Debug information */ @@ -183,12 +185,11 @@ void MC_dpor(void) xbt_swag_foreach(process, simix_global->process_list){ if(MC_process_is_enabled(process)){ MC_state_interleave_process(next_state, process); - if((xbt_fifo_size(mc_stack_safety) + 1) != (_surf_mc_max_depth - 1)) - break; + XBT_DEBUG("Process %lu enabled with simcall %d", process->pid, process->simcall.call); } } - if(_surf_mc_checkpoint && ((xbt_fifo_size(mc_stack_safety) + 1) % _surf_mc_checkpoint == 0)){ + if(_sg_mc_checkpoint && ((xbt_fifo_size(mc_stack_safety) + 1) % _sg_mc_checkpoint == 0)){ next_state->system_state = MC_take_snapshot(); } @@ -201,16 +202,12 @@ void MC_dpor(void) xbt_fifo_unshift(mc_stack_safety, next_state); MC_UNSET_RAW_MEM; - /* FIXME: Update Statistics - mc_stats->state_size += - xbt_setset_set_size(next_state->enabled_transitions);*/ - /* Let's loop again */ /* The interleave set is empty or the maximum depth is reached, let's back-track */ } else { - if(xbt_fifo_size(mc_stack_safety) == _surf_mc_max_depth) + if(xbt_fifo_size(mc_stack_safety) == _sg_mc_max_depth) XBT_WARN("/!\\ Max depth reached ! /!\\ "); else XBT_DEBUG("There are no more processes to interleave."); @@ -251,27 +248,27 @@ void MC_dpor(void) xbt_free(req_str); } - if(!MC_state_process_is_done(prev_state, req->issuer)) - MC_state_interleave_process(prev_state, req->issuer); - else - XBT_DEBUG("Process %p is in done set", req->issuer); - break; - }else if(req->issuer == MC_state_get_executed_request(prev_state, &value)->issuer){ + }else if(req->issuer == MC_state_get_internal_request(prev_state)->issuer){ + XBT_DEBUG("Simcall %d and %d with same issuer", req->call, MC_state_get_internal_request(prev_state)->call); break; + }else{ + + MC_state_remove_interleave_process(prev_state, req->issuer); + XBT_DEBUG("Simcall %d in process %lu independant with simcall %d process %lu", req->call, req->issuer->pid, MC_state_get_internal_request(prev_state)->call, MC_state_get_internal_request(prev_state)->issuer->pid); + } } - + if (MC_state_interleave_size(state)) { /* We found a back-tracking point, let's loop */ - if(_surf_mc_checkpoint){ + if(_sg_mc_checkpoint){ if(state->system_state != NULL){ MC_restore_snapshot(state->system_state); xbt_fifo_unshift(mc_stack_safety, state); - XBT_DEBUG("Back-tracking to depth %d", xbt_fifo_size(mc_stack_safety)); MC_UNSET_RAW_MEM; }else{ pos = xbt_fifo_size(mc_stack_safety); @@ -287,16 +284,41 @@ void MC_dpor(void) } MC_restore_snapshot(restore_state->system_state); xbt_fifo_unshift(mc_stack_safety, state); - XBT_DEBUG("Back-tracking to depth %d", xbt_fifo_size(mc_stack_safety)); MC_UNSET_RAW_MEM; MC_replay(mc_stack_safety, pos); } }else{ xbt_fifo_unshift(mc_stack_safety, state); - XBT_DEBUG("Back-tracking to depth %d", xbt_fifo_size(mc_stack_safety)); MC_UNSET_RAW_MEM; MC_replay(mc_stack_safety, -1); } + + MC_SET_RAW_MEM; + req2 = *req; + for(i=0; ipid, prev_req->call, prev_req->issuer->pid); + interleave_proc[prev_req->issuer->pid] = 1; + }else{ + XBT_DEBUG("Simcall %d in process %lu independant with simcall %d in process %lu", req2.call, req2.issuer->pid, prev_req->call, prev_req->issuer->pid); + MC_state_remove_interleave_process(state, prev_req->issuer); + } + } + } + xbt_swag_foreach(process, simix_global->process_list){ + if(interleave_proc[process->pid] == 1) + MC_state_interleave_process(state, process); + } + XBT_DEBUG("Back-tracking to depth %d", xbt_fifo_size(mc_stack_safety)); + MC_UNSET_RAW_MEM; break; } else { MC_state_delete(state);