X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c59fb90ea83ce58355bc388b1a5ebaef96420806..87bc879019fc94e7ff1bc1ada77ecf85b0b588af:/src/mc/mc_global.c diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index 6cd26b852d..461e0b53a9 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -86,6 +86,8 @@ void _mc_cfg_cb_visited(const char *name, int pos) { mc_state_t mc_current_state = NULL; char mc_replay_mode = FALSE; double *mc_time = NULL; +mc_comparison_times_t mc_comp_times = NULL; +double mc_snapshot_comparison_time; /* Safety */ @@ -120,8 +122,15 @@ static dw_location_t get_location(xbt_dict_t location_list, char *expr); static dw_frame_t get_frame_by_offset(xbt_dict_t all_variables, unsigned long int offset); static size_t data_bss_ignore_size(void *address); static void MC_get_global_variables(char *elf_file); +static void heap_ignore_region_free(mc_heap_ignore_region_t r); +static void heap_ignore_region_free_voidp(void *r); void MC_do_the_modelcheck_for_real() { + + MC_SET_RAW_MEM; + mc_comp_times = xbt_new0(s_mc_comparison_times_t, 1); + MC_UNSET_RAW_MEM; + if (!_sg_mc_property_file || _sg_mc_property_file[0]=='\0') { if (mc_reduce_kind==e_mc_reduce_unset) mc_reduce_kind=e_mc_reduce_dpor; @@ -175,12 +184,17 @@ void MC_init(){ xbt_dict_t libsimgrid_location_list = MC_get_location_list(libsimgrid_path); MC_get_local_variables(libsimgrid_path, libsimgrid_location_list, &mc_local_variables); + xbt_dict_free(&libsimgrid_location_list); + xbt_dict_free(&binary_location_list); + /* Get .plt section (start and end addresses) for data libsimgrid and data program comparison */ get_libsimgrid_plt_section(); get_binary_plt_section(); MC_ignore_data_bss(&end_raw_heap, sizeof(end_raw_heap)); - + MC_ignore_data_bss(&mc_comp_times, sizeof(mc_comp_times)); + MC_ignore_data_bss(&mc_snapshot_comparison_time, sizeof(mc_snapshot_comparison_time)); + /* Get global variables */ MC_get_global_variables(xbt_binary_name); MC_get_global_variables(libsimgrid_path); @@ -732,6 +746,15 @@ void MC_automaton_new_propositional_symbol(const char* id, void* fct) { /************ MC_ignore ***********/ +static void heap_ignore_region_free(mc_heap_ignore_region_t r){ + if(r) + xbt_free(r); +} + +static void heap_ignore_region_free_voidp(void *r){ + heap_ignore_region_free((mc_heap_ignore_region_t) * (void **) r); +} + void MC_ignore_heap(void *address, size_t size){ int raw_mem_set = (mmalloc_get_current_heap() == raw_heap); @@ -739,25 +762,21 @@ void MC_ignore_heap(void *address, size_t size){ MC_SET_RAW_MEM; if(mc_heap_comparison_ignore == NULL) - mc_heap_comparison_ignore = xbt_dynar_new(sizeof(mc_heap_ignore_region_t), NULL); + mc_heap_comparison_ignore = xbt_dynar_new(sizeof(mc_heap_ignore_region_t), heap_ignore_region_free_voidp); mc_heap_ignore_region_t region = NULL; region = xbt_new0(s_mc_heap_ignore_region_t, 1); region->address = address; region->size = size; - if((address >= std_heap) && (address <= (void*)((char *)std_heap + STD_HEAP_SIZE))){ - - region->block = ((char*)address - (char*)((xbt_mheap_t)std_heap)->heapbase) / BLOCKSIZE + 1; - - if(((xbt_mheap_t)std_heap)->heapinfo[region->block].type == 0){ - region->fragment = -1; - ((xbt_mheap_t)std_heap)->heapinfo[region->block].busy_block.ignore = 1; - }else{ - region->fragment = ((uintptr_t) (ADDR2UINT (address) % (BLOCKSIZE))) >> ((xbt_mheap_t)std_heap)->heapinfo[region->block].type; - ((xbt_mheap_t)std_heap)->heapinfo[region->block].busy_frag.ignore[region->fragment] = 1; - } - + region->block = ((char*)address - (char*)((xbt_mheap_t)std_heap)->heapbase) / BLOCKSIZE + 1; + + if(((xbt_mheap_t)std_heap)->heapinfo[region->block].type == 0){ + region->fragment = -1; + ((xbt_mheap_t)std_heap)->heapinfo[region->block].busy_block.ignore = 1; + }else{ + region->fragment = ((uintptr_t) (ADDR2UINT (address) % (BLOCKSIZE))) >> ((xbt_mheap_t)std_heap)->heapinfo[region->block].type; + ((xbt_mheap_t)std_heap)->heapinfo[region->block].busy_frag.ignore[region->fragment] = 1; } unsigned int cursor = 0; @@ -775,6 +794,48 @@ void MC_ignore_heap(void *address, size_t size){ MC_SET_RAW_MEM; } +void MC_remove_ignore_heap(void *address, size_t size){ + + int raw_mem_set = (mmalloc_get_current_heap() == raw_heap); + + MC_SET_RAW_MEM; + + unsigned int cursor = 0; + int start = 0; + int end = xbt_dynar_length(mc_heap_comparison_ignore) - 1; + mc_heap_ignore_region_t region; + int ignore_found = 0; + + while(start <= end){ + cursor = (start + end) / 2; + region = (mc_heap_ignore_region_t)xbt_dynar_get_as(mc_heap_comparison_ignore, cursor, mc_heap_ignore_region_t); + if(region->address == address){ + ignore_found = 1; + break; + } + if(region->address < address) + start = cursor + 1; + if(region->address > address){ + if((char * )region->address <= ((char *)address + size)){ + ignore_found = 1; + break; + }else + end = cursor - 1; + } + } + + if(ignore_found == 1){ + xbt_dynar_remove_at(mc_heap_comparison_ignore, cursor, NULL); + MC_remove_ignore_heap(address, size); + } + + MC_UNSET_RAW_MEM; + + if(raw_mem_set) + MC_SET_RAW_MEM; + +} + void MC_ignore_data_bss(void *address, size_t size){ int raw_mem_set = (mmalloc_get_current_heap() == raw_heap); @@ -1039,13 +1100,14 @@ xbt_dict_t MC_get_location_list(const char *elf_file){ char *key = bprintf("%d", (int)strtoul((char *)xbt_dynar_get_as(split, 0, char *), NULL, 16)); xbt_dict_set(location_list, key, loclist, NULL); + xbt_free(key); xbt_dynar_free(&split); } - free(line); - free(command); + xbt_free(line); + xbt_free(command); pclose(fp); return location_list; @@ -1058,10 +1120,13 @@ static dw_frame_t get_frame_by_offset(xbt_dict_t all_variables, unsigned long in dw_frame_t res; xbt_dict_foreach(all_variables, cursor, name, res) { - if(offset >= res->start && offset < res->end) + if(offset >= res->start && offset < res->end){ + xbt_dict_cursor_free(&cursor); return res; + } } + xbt_dict_cursor_free(&cursor); return NULL; } @@ -1168,11 +1233,12 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ xbt_str_rtrim(abstract_origin, ">"); subprogram_name = (char *)xbt_dict_get_or_null(subprograms_origin, abstract_origin); frame = xbt_dict_get_or_null(*all_variables, subprogram_name); + xbt_free(abstract_origin); }else if(strcmp(node_type, "DW_AT_name") == 0){ new_frame = 1; - free(current_frame); + xbt_free(current_frame); frame = xbt_new0(s_dw_frame_t, 1); frame->name = strdup(xbt_dynar_get_as(split, xbt_dynar_length(split) - 1, char *)); frame->variables = xbt_dict_new_homogeneous(NULL); @@ -1198,6 +1264,7 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ xbt_str_rtrim(loc_expr, ")"); frame->frame_base = get_location(NULL, loc_expr); xbt_dynar_free(&split2); + xbt_free(loc_expr); } @@ -1213,8 +1280,8 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ }else if(strcmp(node_type, "DW_AT_MIPS_linkage_name:") == 0){ - free(frame->name); - free(current_frame); + xbt_free(frame->name); + xbt_free(current_frame); frame->name = strdup(xbt_dynar_get_as(split, xbt_dynar_length(split) - 1, char *)); current_frame = strdup(frame->name); xbt_dict_set(subprograms_origin, subprogram_start, frame->name, NULL); @@ -1232,9 +1299,9 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ xbt_dict_set(*all_variables, frame->name, frame, NULL); } - free(subprogram_start); + xbt_free(subprogram_start); if(subprogram_end != NULL){ - free(subprogram_end); + xbt_free(subprogram_end); subprogram_end = NULL; } @@ -1314,6 +1381,7 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ xbt_str_rtrim(loc_expr, ")"); var->location = get_location(NULL, loc_expr); xbt_dynar_free(&split2); + xbt_free(loc_expr); } @@ -1402,8 +1470,8 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ } xbt_dynar_free(&split); - free(line); - free(command); + xbt_free(line); + xbt_free(command); pclose(fp); } @@ -1417,8 +1485,9 @@ static dw_location_t get_location(xbt_dict_t location_list, char *expr){ char *key = bprintf("%d", (int)strtoul(expr, NULL, 16)); loc->type = e_dw_loclist; loc->location.loclist = (xbt_dynar_t)xbt_dict_get_or_null(location_list, key); - if(loc == NULL) + if(loc->location.loclist == NULL) XBT_INFO("Key not found in loclist"); + xbt_free(key); return loc; }else{ @@ -1757,8 +1826,8 @@ static void MC_get_global_variables(char *elf_file){ } - free(command); - free(line); + xbt_free(command); + xbt_free(line); pclose(fp); }