static int is_exploration_stack_state(mc_state_t current_state) { xbt_fifo_item_t item; mc_state_t stack_state; for(item = xbt_fifo_get_first_item(mc_stack); item != nullptr; item = xbt_fifo_get_next_item(item)) { stack_state = (mc_state_t) xbt_fifo_get_item_content(item); if(snapshot_compare(stack_state, current_state) == 0) { XBT_INFO("Non-progressive cycle : state %d -> state %d", stack_state->num, current_state->num); return 1; } } return 0; }
int simcall_HANDLER_mc_compare_snapshots(smx_simcall_t simcall, mc_snapshot_t s1, mc_snapshot_t s2) { return snapshot_compare(s1, s2); }
static int is_visited_state(){ if(_sg_mc_visited == 0) return -1; int raw_mem_set = (mmalloc_get_current_heap() == raw_heap); MC_SET_RAW_MEM; mc_visited_state_t new_state = visited_state_new(); MC_UNSET_RAW_MEM; if(xbt_dynar_is_empty(visited_states)){ MC_SET_RAW_MEM; xbt_dynar_push(visited_states, &new_state); MC_UNSET_RAW_MEM; if(raw_mem_set) MC_SET_RAW_MEM; return -1; }else{ MC_SET_RAW_MEM; size_t current_bytes_used = new_state->heap_bytes_used; int current_nb_processes = new_state->nb_processes; unsigned int cursor = 0; int previous_cursor = 0, next_cursor = 0; int start = 0; int end = xbt_dynar_length(visited_states) - 1; mc_visited_state_t state_test = NULL; size_t bytes_used_test; int nb_processes_test; int same_processes_and_bytes_not_found = 1; while(start <= end && same_processes_and_bytes_not_found){ cursor = (start + end) / 2; state_test = (mc_visited_state_t)xbt_dynar_get_as(visited_states, cursor, mc_visited_state_t); bytes_used_test = state_test->heap_bytes_used; nb_processes_test = state_test->nb_processes; if(nb_processes_test < current_nb_processes){ start = cursor + 1; }else if(nb_processes_test > current_nb_processes){ end = cursor - 1; }else if(nb_processes_test == current_nb_processes){ if(bytes_used_test < current_bytes_used) start = cursor + 1; if(bytes_used_test > current_bytes_used) end = cursor - 1; if(bytes_used_test == current_bytes_used){ same_processes_and_bytes_not_found = 0; if(snapshot_compare(new_state->system_state, state_test->system_state) == 0){ 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 state_test->num; }else{ /* Search another state with same number of bytes used in std_heap */ previous_cursor = cursor - 1; while(previous_cursor >= 0){ state_test = (mc_visited_state_t)xbt_dynar_get_as(visited_states, previous_cursor, mc_visited_state_t); bytes_used_test = state_test->system_state->heap_bytes_used; if(bytes_used_test != current_bytes_used) break; if(snapshot_compare(new_state->system_state, state_test->system_state) == 0){ 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 state_test->num; } previous_cursor--; } next_cursor = cursor + 1; while(next_cursor < xbt_dynar_length(visited_states)){ state_test = (mc_visited_state_t)xbt_dynar_get_as(visited_states, next_cursor, mc_visited_state_t); bytes_used_test = state_test->system_state->heap_bytes_used; if(bytes_used_test != current_bytes_used) break; if(snapshot_compare(new_state->system_state, state_test->system_state) == 0){ 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 state_test->num; } next_cursor++; } } } } } state_test = (mc_visited_state_t)xbt_dynar_get_as(visited_states, cursor, mc_visited_state_t); bytes_used_test = state_test->heap_bytes_used; if(bytes_used_test < current_bytes_used) xbt_dynar_insert_at(visited_states, cursor + 1, &new_state); else xbt_dynar_insert_at(visited_states, cursor, &new_state); if(xbt_dynar_length(visited_states) > _sg_mc_visited){ int min = mc_stats->expanded_states; unsigned int cursor2 = 0; unsigned int index = 0; xbt_dynar_foreach(visited_states, cursor2, state_test){ if(state_test->num < min){ index = cursor2; min = state_test->num; } } xbt_dynar_remove_at(visited_states, index, NULL); } MC_UNSET_RAW_MEM; if(raw_mem_set) MC_SET_RAW_MEM; return -1; }