static int is_visited_state(){
if(_sg_mc_visited == 0)
- return 0;
+ return -1;
int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
if(raw_mem_set)
MC_SET_RAW_MEM;
- return 0;
+ return -1;
}else{
if(snapshot_compare(new_state->system_state, state_test->system_state) == 0){
xbt_dynar_remove_at(visited_states, cursor, NULL);
xbt_dynar_insert_at(visited_states, cursor, &new_state);
+ XBT_DEBUG("State %d already visited ! (equal to state %d)", new_state->num, state_test->num);
if(raw_mem_set)
MC_SET_RAW_MEM;
else
MC_UNSET_RAW_MEM;
- return 1;
+ return state_test->num;
}else{
/* Search another state with same number of bytes used */
previous_cursor = cursor - 1;
if(snapshot_compare(new_state->system_state, state_test->system_state) == 0){
xbt_dynar_remove_at(visited_states, previous_cursor, NULL);
xbt_dynar_insert_at(visited_states, previous_cursor, &new_state);
+ XBT_DEBUG("State %d already visited ! (equal to state %d)", new_state->num, state_test->num);
if(raw_mem_set)
MC_SET_RAW_MEM;
else
MC_UNSET_RAW_MEM;
- return 1;
+ return state_test->num;
}
previous_cursor--;
}
if(snapshot_compare(new_state->system_state, state_test->system_state) == 0){
xbt_dynar_remove_at(visited_states, next_cursor, NULL);
xbt_dynar_insert_at(visited_states, next_cursor, &new_state);
+ XBT_DEBUG("State %d already visited ! (equal to state %d)", new_state->num, state_test->num);
if(raw_mem_set)
MC_SET_RAW_MEM;
else
MC_UNSET_RAW_MEM;
- return 1;
+ return state_test->num;
}
next_cursor++;
}
if(raw_mem_set)
MC_SET_RAW_MEM;
- return 0;
+ return -1;
}
}
xbt_fifo_item_t item = NULL;
int pos, i, interleave_size;
int interleave_proc[simix_process_maxpid];
+ int visited_state;
while (xbt_fifo_size(mc_stack_safety) > 0) {
XBT_DEBUG("Execute: %s", req_str);
xbt_free(req_str);
}
+
+ req_str = MC_request_get_dot_output(req, value);
MC_state_set_executed_request(state, req, value);
mc_stats->executed_transitions++;
next_state = MC_state_new();
- if(!is_visited_state()){
+ if((visited_state = is_visited_state()) == -1){
/* Get an enabled process and insert it in the interleave set of the next state */
xbt_swag_foreach(process, simix_global->process_list){
next_state->system_state = MC_take_snapshot();
}
+ if(dot_output != NULL)
+ fprintf(dot_output, "\"%d\" -> \"%d\" [%s];\n", state->num, next_state->num, req_str);
+
}else{
- XBT_DEBUG("State already visited !");
-
+ if(dot_output != NULL)
+ fprintf(dot_output, "\"%d\" -> \"%d\" [%s];\n", state->num, visited_state, req_str);
+
}
+
+
xbt_fifo_unshift(mc_stack_safety, next_state);
MC_UNSET_RAW_MEM;
+ xbt_free(req_str);
+
/* Let's loop again */
/* The interleave set is empty or the maximum depth is reached, let's back-track */