X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1e896e691f69c6e46566d038d37b4fd7ea18fa3d..1fe09f54bac3c43710f19de37bcec99cd19b92a8:/src/mc/mc_global.c diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index 394d2a9908..97e31b9631 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,11 +184,16 @@ 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); @@ -197,6 +211,9 @@ void MC_init(){ MC_ignore_stack("_throw_ctx", "*"); MC_ignore_stack("ctx", "*"); + MC_ignore_stack("next_context", "smx_ctx_sysv_suspend_serial"); + MC_ignore_stack("i", "smx_ctx_sysv_suspend_serial"); + if(raw_mem_set) MC_SET_RAW_MEM; @@ -286,6 +303,7 @@ void MC_exit(void) { xbt_free(mc_time); MC_memory_exit(); + xbt_abort(); } @@ -728,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); @@ -735,23 +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; - }else{ - region->fragment = ((uintptr_t) (ADDR2UINT (address) % (BLOCKSIZE))) >> ((xbt_mheap_t)std_heap)->heapinfo[region->block].type; - } - + 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; @@ -1033,13 +1058,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; @@ -1052,10 +1078,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; } @@ -1162,11 +1191,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); @@ -1192,6 +1222,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); } @@ -1207,8 +1238,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); @@ -1226,9 +1257,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; } @@ -1308,6 +1339,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); } @@ -1396,8 +1428,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); } @@ -1411,8 +1443,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{ @@ -1751,8 +1784,8 @@ static void MC_get_global_variables(char *elf_file){ } - free(command); - free(line); + xbt_free(command); + xbt_free(line); pclose(fp); }