X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e37c1e4bba9bb89cd2842f08cde998eb7f941d04..4d27a92b07b781ad03da0848332a26c289358bc9:/src/mc/mc_global.c diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index 7043e09b49..672765afd7 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -303,11 +303,16 @@ void MC_exit(void) xbt_abort(); } +int SIMIX_pre_mc_random(smx_simcall_t simcall){ -int MC_random(int min, int max) + return simcall->mc_value; +} + + +int MC_random(void) { /*FIXME: return mc_current_state->executed_transition->random.value;*/ - return 0; + return simcall_mc_random(); } /** @@ -744,8 +749,7 @@ void MC_automaton_new_propositional_symbol(const char* id, void* fct) { /************ MC_ignore ***********/ void heap_ignore_region_free(mc_heap_ignore_region_t r){ - if(r) - xbt_free(r); + xbt_free(r); } void heap_ignore_region_free_voidp(void *r){ @@ -757,15 +761,12 @@ void MC_ignore_heap(void *address, size_t size){ int raw_mem_set = (mmalloc_get_current_heap() == raw_heap); MC_SET_RAW_MEM; - - if(mc_heap_comparison_ignore == 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; - + region->block = ((char*)address - (char*)((xbt_mheap_t)std_heap)->heapbase) / BLOCKSIZE + 1; if(((xbt_mheap_t)std_heap)->heapinfo[region->block].type == 0){ @@ -775,15 +776,39 @@ void MC_ignore_heap(void *address, size_t size){ 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; } + + if(mc_heap_comparison_ignore == NULL){ + mc_heap_comparison_ignore = xbt_dynar_new(sizeof(mc_heap_ignore_region_t), heap_ignore_region_free_voidp); + xbt_dynar_push(mc_heap_comparison_ignore, ®ion); + if(!raw_mem_set) + MC_UNSET_RAW_MEM; + return; + } unsigned int cursor = 0; mc_heap_ignore_region_t current_region; - xbt_dynar_foreach(mc_heap_comparison_ignore, cursor, current_region){ + int start = 0; + int end = xbt_dynar_length(mc_heap_comparison_ignore) - 1; + + while(start <= end){ + cursor = (start + end) / 2; + current_region = (mc_heap_ignore_region_t)xbt_dynar_get_as(mc_heap_comparison_ignore, cursor, mc_heap_ignore_region_t); + if(current_region->address == address){ + heap_ignore_region_free(region); + if(!raw_mem_set) + MC_UNSET_RAW_MEM; + return; + } + if(current_region->address < address) + start = cursor + 1; if(current_region->address > address) - break; + end = cursor - 1; } - xbt_dynar_insert_at(mc_heap_comparison_ignore, cursor, ®ion); + if(current_region->address < address) + xbt_dynar_insert_at(mc_heap_comparison_ignore, cursor + 1, ®ion); + else + xbt_dynar_insert_at(mc_heap_comparison_ignore, cursor, ®ion); MC_UNSET_RAW_MEM; @@ -940,7 +965,7 @@ static size_t data_bss_ignore_size(void *address){ -void MC_ignore_stack(const char *var_name, const char *frame){ +void MC_ignore_stack(const char *var_name, const char *frame_name){ int raw_mem_set = (mmalloc_get_current_heap() == raw_heap); @@ -954,7 +979,7 @@ void MC_ignore_stack(const char *var_name, const char *frame){ 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); + var->frame = strdup(frame_name); xbt_dynar_insert_at(mc_stack_comparison_ignore, 0, &var); @@ -968,7 +993,7 @@ void MC_ignore_stack(const char *var_name, const char *frame){ 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->frame, frame_name) == 0){ if(strcmp(current_var->var_name, var_name) == 0){ MC_UNSET_RAW_MEM; if(raw_mem_set) @@ -980,24 +1005,36 @@ void MC_ignore_stack(const char *var_name, const char *frame){ if(strcmp(current_var->var_name, var_name) > 0) end = cursor - 1; } - if(strcmp(current_var->frame, frame) < 0) + if(strcmp(current_var->frame, frame_name) < 0) start = cursor + 1; - if(strcmp(current_var->frame, frame) > 0) + if(strcmp(current_var->frame, frame_name) > 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); + var->frame = strdup(frame_name); - if(strcmp(current_var->frame, frame) < 0) + if(strcmp(current_var->frame, frame_name) < 0) xbt_dynar_insert_at(mc_stack_comparison_ignore, cursor + 1, &var); else xbt_dynar_insert_at(mc_stack_comparison_ignore, cursor, &var); } + /* Remove variable from mc_local_variables */ + + if(mc_local_variables != NULL){ + + if(strcmp(frame_name, "*") != 0){ + dw_frame_t frame = xbt_dict_get_or_null(mc_local_variables, frame_name); + if(frame != NULL) + xbt_dict_remove(frame->variables, var_name); + } + + } + MC_UNSET_RAW_MEM; if(raw_mem_set) @@ -1321,10 +1358,8 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ } xbt_free(subprogram_start); - if(subprogram_end != NULL){ - xbt_free(subprogram_end); - subprogram_end = NULL; - } + xbt_free(subprogram_end); + subprogram_end = NULL; }else if(strcmp(node_type, "(DW_TAG_variable)") == 0){ /* New variable */