X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/6db84410f825c13cdebbdec30aa7955f0864cf08..0645cbd02f4f44ea8d916a2093c1776002ebdcf4:/src/mc/mc_global.c diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index 6c52e8bf19..e7a8de6b3f 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -73,14 +73,15 @@ mc_stats_t mc_stats = NULL; mc_stats_pair_t mc_stats_pair = NULL; xbt_fifo_t mc_stack_liveness = NULL; -mc_snapshot_t initial_snapshot_liveness = NULL; +mc_global_t initial_state_liveness = NULL; int compare; /* Local */ xbt_dict_t mc_local_variables = NULL; /* Ignore mechanism */ -extern xbt_dynar_t mc_comparison_ignore; +xbt_dynar_t mc_stack_comparison_ignore; +extern xbt_dynar_t mc_heap_comparison_ignore; extern xbt_dynar_t stacks_areas; xbt_automaton_t _mc_property_automaton = NULL; @@ -148,8 +149,6 @@ void MC_init_safety(void) if(raw_mem_set) MC_SET_RAW_MEM; - else - MC_UNSET_RAW_MEM; } @@ -166,13 +165,15 @@ void MC_modelcheck(void) } void MC_init_liveness(){ + + raw_mem_set = (mmalloc_get_current_heap() == raw_heap); mc_time = xbt_new0(double, simix_process_maxpid); /* mc_time refers to clock for each process -> ignore it for heap comparison */ int i; for(i = 0; iinitial_snapshot); /* At the moment of taking the snapshot the raw heap was set, so restoring * it will set it back again, we have to unset it to continue */ + MC_UNSET_RAW_MEM; if(all_stack){ @@ -458,7 +462,7 @@ void MC_replay_liveness(xbt_fifo_t stack, int all_stack) XBT_DEBUG("**** End Replay ****"); - if(raw_mem_set) + if(raw_mem) MC_SET_RAW_MEM; else MC_UNSET_RAW_MEM; @@ -567,8 +571,6 @@ void MC_dump_stack_liveness(xbt_fifo_t stack){ if(raw_mem_set) MC_SET_RAW_MEM; - else - MC_UNSET_RAW_MEM; } @@ -654,8 +656,6 @@ void MC_automaton_load(const char *file){ if(raw_mem_set) MC_SET_RAW_MEM; - else - MC_UNSET_RAW_MEM; } @@ -674,22 +674,22 @@ void MC_automaton_new_propositional_symbol(const char* id, void* fct) { if(raw_mem_set) MC_SET_RAW_MEM; - else - MC_UNSET_RAW_MEM; } /************ MC_ignore ***********/ -void MC_ignore(void *address, size_t size){ +void MC_ignore_heap(void *address, size_t size){ + + raw_mem_set = (mmalloc_get_current_heap() == raw_heap); MC_SET_RAW_MEM; - if(mc_comparison_ignore == NULL) - mc_comparison_ignore = xbt_dynar_new(sizeof(mc_ignore_region_t), NULL); + if(mc_heap_comparison_ignore == NULL) + mc_heap_comparison_ignore = xbt_dynar_new(sizeof(mc_heap_ignore_region_t), NULL); - mc_ignore_region_t region = NULL; - region = xbt_new0(s_mc_ignore_region_t, 1); + mc_heap_ignore_region_t region = NULL; + region = xbt_new0(s_mc_heap_ignore_region_t, 1); region->address = address; region->size = size; @@ -706,21 +706,90 @@ void MC_ignore(void *address, size_t size){ } unsigned int cursor = 0; - mc_ignore_region_t current_region; - xbt_dynar_foreach(mc_comparison_ignore, cursor, current_region){ + mc_heap_ignore_region_t current_region; + xbt_dynar_foreach(mc_heap_comparison_ignore, cursor, current_region){ if(current_region->address > address) break; } - xbt_dynar_insert_at(mc_comparison_ignore, cursor, ®ion); + xbt_dynar_insert_at(mc_heap_comparison_ignore, cursor, ®ion); MC_UNSET_RAW_MEM; + + if(raw_mem_set) + MC_SET_RAW_MEM; } -void MC_new_stack_area(void *stack, char *name, void* context){ +void MC_ignore_stack(const char *var_name, const char *frame){ + + raw_mem_set = (mmalloc_get_current_heap() == raw_heap); MC_SET_RAW_MEM; + if(mc_stack_comparison_ignore == NULL) + mc_stack_comparison_ignore = xbt_dynar_new(sizeof(mc_stack_ignore_variable_t), NULL); + + if(xbt_dynar_is_empty(mc_stack_comparison_ignore)){ + + mc_stack_ignore_variable_t var = NULL; + var = xbt_new0(s_mc_stack_ignore_variable_t, 1); + var->var_name = strdup(var_name); + var->frame = strdup(frame); + + xbt_dynar_insert_at(mc_stack_comparison_ignore, 0, &var); + + }else{ + + unsigned int cursor = 0; + int start = 0; + int end = xbt_dynar_length(mc_stack_comparison_ignore) - 1; + mc_stack_ignore_variable_t current_var = NULL; + + while(start <= end){ + cursor = (start + end) / 2; + current_var = (mc_stack_ignore_variable_t)xbt_dynar_get_as(mc_stack_comparison_ignore, cursor, mc_stack_ignore_variable_t); + if(strcmp(current_var->frame, frame) == 0){ + if(strcmp(current_var->var_name, var_name) == 0){ + MC_UNSET_RAW_MEM; + if(raw_mem_set) + MC_SET_RAW_MEM; + return; + } + if(strcmp(current_var->var_name, var_name) < 0) + start = cursor + 1; + if(strcmp(current_var->var_name, var_name) > 0) + end = cursor - 1; + } + if(strcmp(current_var->frame, frame) < 0) + start = cursor + 1; + if(strcmp(current_var->frame, frame) > 0) + end = cursor - 1; + } + + mc_stack_ignore_variable_t var = NULL; + var = xbt_new0(s_mc_stack_ignore_variable_t, 1); + var->var_name = strdup(var_name); + var->frame = strdup(frame); + + if(strcmp(current_var->frame, frame) < 0) + xbt_dynar_insert_at(mc_stack_comparison_ignore, cursor + 1, &var); + else + xbt_dynar_insert_at(mc_stack_comparison_ignore, cursor, &var); + + } + + MC_UNSET_RAW_MEM; + + if(raw_mem_set) + MC_SET_RAW_MEM; + +} + +void MC_new_stack_area(void *stack, char *name, void* context){ + + raw_mem_set = (mmalloc_get_current_heap() == raw_heap); + + MC_SET_RAW_MEM; if(stacks_areas == NULL) stacks_areas = xbt_dynar_new(sizeof(stack_region_t), NULL); @@ -732,6 +801,9 @@ void MC_new_stack_area(void *stack, char *name, void* context){ xbt_dynar_push(stacks_areas, ®ion); MC_UNSET_RAW_MEM; + + if(raw_mem_set) + MC_SET_RAW_MEM; } /************ DWARF ***********/ @@ -1282,7 +1354,7 @@ static dw_location_t get_location(xbt_dict_t location_list, char *expr){ dw_location_t new_element = xbt_new0(s_dw_location_t, 1); new_element->type = e_dw_bregister_op; new_element->location.breg_op.reg = atoi(strtok(tok2, "DW_OP_breg")); - new_element->location.breg_op.offset = atoi(xbt_dynar_get_as(tokens2, 2, char*)); + new_element->location.breg_op.offset = atoi(xbt_dynar_get_as(tokens2, 1, char*)); xbt_dynar_push(loc->location.compose, &new_element); }else if(strncmp(tok2, "DW_OP_lit", 9) == 0){ dw_location_t new_element = xbt_new0(s_dw_location_t, 1);