"Logging specific to MC DPOR exploration");
xbt_dynar_t visited_states;
-int nb_visited_states = 0;
static int is_visited_state(void);
static void visited_state_free(mc_safety_visited_state_t state);
static int is_visited_state(){
- nb_visited_states++;
-
if(_sg_mc_visited == 0)
return 0;
mc_safety_visited_state_t new_state = NULL;
new_state = xbt_new0(s_mc_safety_visited_state_t, 1);
new_state->system_state = MC_take_snapshot();
- new_state->num = nb_visited_states;
+ new_state->num = mc_stats->expanded_states;
MC_UNSET_RAW_MEM;
MC_SET_RAW_MEM;
- size_t current_chunks_used = mmalloc_get_chunks_used((xbt_mheap_t)(new_state->system_state)->regions[get_heap_region_index(new_state->system_state)]->data);
+ size_t current_chunks_used = new_state->system_state->heap_chunks_used;
unsigned int cursor = 0;
int previous_cursor = 0, next_cursor = 0;
while(start <= end && same_chunks_not_found){
cursor = (start + end) / 2;
state_test = (mc_safety_visited_state_t)xbt_dynar_get_as(visited_states, cursor, mc_safety_visited_state_t);
- chunks_used_test = mmalloc_get_chunks_used((xbt_mheap_t)(state_test->system_state)->regions[get_heap_region_index(state_test->system_state)]->data);
+ chunks_used_test = state_test->system_state->heap_chunks_used;
if(chunks_used_test < current_chunks_used)
start = cursor + 1;
if(chunks_used_test > current_chunks_used)
end = cursor - 1;
if(chunks_used_test == current_chunks_used){
same_chunks_not_found = 0;
- if(snapshot_compare(new_state->system_state, state_test->system_state, NULL, NULL) == 0){
+ 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);
if(raw_mem_set)
previous_cursor = cursor - 1;
while(previous_cursor >= 0){
state_test = (mc_safety_visited_state_t)xbt_dynar_get_as(visited_states, previous_cursor, mc_safety_visited_state_t);
- chunks_used_test = mmalloc_get_chunks_used((xbt_mheap_t)(state_test->system_state)->regions[get_heap_region_index(state_test->system_state)]->data);
+ chunks_used_test = state_test->system_state->heap_chunks_used;
if(chunks_used_test != current_chunks_used)
break;
- if(snapshot_compare(new_state->system_state, state_test->system_state, NULL, NULL) == 0){
+ 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);
if(raw_mem_set)
next_cursor = cursor + 1;
while(next_cursor < xbt_dynar_length(visited_states)){
state_test = (mc_safety_visited_state_t)xbt_dynar_get_as(visited_states, next_cursor, mc_safety_visited_state_t);
- chunks_used_test = mmalloc_get_chunks_used((xbt_mheap_t)(state_test->system_state)->regions[get_heap_region_index(state_test->system_state)]->data);
+ chunks_used_test = state_test->system_state->heap_chunks_used;
if(chunks_used_test != current_chunks_used)
break;
- if(snapshot_compare(new_state->system_state, state_test->system_state, NULL, NULL) == 0){
+ 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);
if(raw_mem_set)
}
}
}
-
- if(xbt_dynar_length(visited_states) == _sg_mc_visited){
- int min = nb_visited_states;
+
+ state_test = (mc_safety_visited_state_t)xbt_dynar_get_as(visited_states, cursor, mc_safety_visited_state_t);
+ chunks_used_test = state_test->system_state->heap_chunks_used;
+
+ if(chunks_used_test < current_chunks_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;
+ unsigned int index = 0;
xbt_dynar_foreach(visited_states, cursor2, state_test){
if(state_test->num < min){
index = cursor2;
}
xbt_dynar_remove_at(visited_states, index, NULL);
}
-
- if(cursor > 0)
- cursor--;
-
- if(chunks_used_test < current_chunks_used)
- xbt_dynar_insert_at(visited_states, cursor + 1, &new_state);
- else
- xbt_dynar_insert_at(visited_states, cursor, &new_state);
MC_UNSET_RAW_MEM;
{
char *req_str;
- int value;
- smx_simcall_t req = NULL, prev_req = NULL;
- s_smx_simcall_t req2;
+ int value, value2;
+ smx_simcall_t req = NULL, prev_req = NULL, req2 = NULL;
+ s_smx_simcall_t req3;
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, i;
+ int pos, i, interleave_size;
int interleave_proc[simix_process_maxpid];
while (xbt_fifo_size(mc_stack_safety) > 0) {
MC_state_set_executed_request(state, req, value);
mc_stats->executed_transitions++;
+ if(MC_state_interleave_size(state)){
+ MC_SET_RAW_MEM;
+ req2 = MC_state_get_internal_request(state);
+ req3 = *req2;
+ for(i=0; i<simix_process_maxpid; i++)
+ interleave_proc[i] = 0;
+ i=0;
+ interleave_size = MC_state_interleave_size(state);
+ while(i < interleave_size){
+ i++;
+ prev_req = MC_state_get_request(state, &value2);
+ if(prev_req != NULL){
+ MC_state_set_executed_request(state, prev_req, value2);
+ prev_req = MC_state_get_internal_request(state);
+ if(MC_request_depend(&req3, prev_req)){
+ XBT_DEBUG("Simcall %d in process %lu dependant with simcall %d in process %lu", req3.call, req3.issuer->pid, 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", req3.call, req3.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);
+ }
+ MC_UNSET_RAW_MEM;
+ }
+
+ MC_state_set_executed_request(state, req, value);
+
/* Answer the request */
SIMIX_simcall_pre(req, value); /* After this call req is no longer usefull */
MC_UNSET_RAW_MEM;
MC_replay(mc_stack_safety, -1);
}
-
- MC_SET_RAW_MEM;
- req2 = *req;
- for(i=0; i<simix_process_maxpid; i++)
- interleave_proc[i] = 0;
- i=0;
- while((i < MC_state_interleave_size(state))){
- i++;
- prev_req = MC_state_get_request(state, &value);
- if(prev_req != NULL){
- MC_state_set_executed_request(state, prev_req, value);
- prev_req = MC_state_get_internal_request(state);
- if(MC_request_depend(&req2, prev_req)){
- XBT_DEBUG("Simcall %d in process %lu dependant with simcall %d in process %lu", req2.call, req2.issuer->pid, 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);