X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7ce270272856fcab2790a35bcefb9d6e0fb52423..7f06482332409f552ac19d126fa69520ade79fcb:/src/mc/mc_global.c diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index 562eb37978..9805ce20e1 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -51,7 +51,7 @@ void _mc_cfg_cb_checkpoint(const char *name, int pos) { if (_sg_init_status && !_sg_do_model_check) { xbt_die("You are specifying a checkpointing value after the initialization (through MSG_config?), but model-checking was not activated at config time (through --cfg=model-check:1). This won't work, sorry."); } - _sg_mc_checkpoint = xbt_cfg_get_int(_sg_cfg_set, name); + _sg_mc_checkpoint = xbt_cfg_get_boolean(_sg_cfg_set, name); } void _mc_cfg_cb_property(const char *name, int pos) { if (_sg_init_status && !_sg_do_model_check) { @@ -64,7 +64,7 @@ void _mc_cfg_cb_timeout(const char *name, int pos) { if (_sg_init_status && !_sg_do_model_check) { xbt_die("You are specifying a value to enable/disable timeout for wait requests after the initialization (through MSG_config?), but model-checking was not activated at config time (through --cfg=model-check:1). This won't work, sorry."); } - _sg_mc_timeout= xbt_cfg_get_int(_sg_cfg_set, name); + _sg_mc_timeout= xbt_cfg_get_boolean(_sg_cfg_set, name); } void _mc_cfg_cb_max_depth(const char *name, int pos) { @@ -138,9 +138,6 @@ void MC_do_the_modelcheck_for_real() { mc_comp_times = xbt_new0(s_mc_comparison_times_t, 1); MC_UNSET_RAW_MEM; - if((_sg_mc_dot_output_file != NULL) && (_sg_mc_dot_output_file[0]!='\0')) - MC_init_dot_output(); - 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; @@ -213,6 +210,9 @@ void MC_init(){ MC_ignore_stack("next_context", "smx_ctx_sysv_suspend_serial"); MC_ignore_stack("i", "smx_ctx_sysv_suspend_serial"); + /* Ignore local variable about time used for tracing */ + MC_ignore_stack("start_time", "*"); + MC_ignore_data_bss(&mc_comp_times, sizeof(mc_comp_times)); MC_ignore_data_bss(&mc_snapshot_comparison_time, sizeof(mc_snapshot_comparison_time)); MC_ignore_data_bss(&mc_time, sizeof(mc_time)); @@ -240,7 +240,7 @@ void MC_init_dot_output(){ xbt_abort(); } - fprintf(dot_output, "digraph graphname{\n fixedsize=true; rankdir=TB; ranksep=.20; edge [fontsize=12]; node [fontsize=10, shape=circle,width=.5 ]; graph [resolution=20, fontsize=10];\n"); + fprintf(dot_output, "digraph graphname{\n fixedsize=true; rankdir=TB; ranksep=.25; edge [fontsize=12]; node [fontsize=10, shape=circle,width=.5 ]; graph [resolution=20, fontsize=10];\n"); } @@ -269,6 +269,9 @@ void MC_modelcheck_safety(void) /* Create exploration stack */ mc_stack_safety = xbt_fifo_new(); + if((_sg_mc_dot_output_file != NULL) && (_sg_mc_dot_output_file[0]!='\0')) + MC_init_dot_output(); + MC_UNSET_RAW_MEM; if(_sg_mc_visited > 0){ @@ -320,6 +323,9 @@ void MC_modelcheck_liveness(){ /* Create the initial state */ initial_state_liveness = xbt_new0(s_mc_global_t, 1); + if((_sg_mc_dot_output_file != NULL) && (_sg_mc_dot_output_file[0]!='\0')) + MC_init_dot_output(); + MC_UNSET_RAW_MEM; MC_ddfs_init(); @@ -336,13 +342,6 @@ void MC_modelcheck_liveness(){ void MC_exit(void) { - MC_SET_RAW_MEM; - if((_sg_mc_dot_output_file != NULL) && (_sg_mc_dot_output_file[0]!='\0')){ - fprintf(dot_output, "}\n"); - fclose(dot_output); - } - MC_UNSET_RAW_MEM; - xbt_free(mc_time); MC_memory_exit(); xbt_abort(); @@ -738,6 +737,12 @@ void MC_print_statistics(mc_stats_t stats) XBT_INFO("Visited pairs = %lu", stats->visited_pairs); } XBT_INFO("Executed transitions = %lu", stats->executed_transitions); + MC_SET_RAW_MEM; + if((_sg_mc_dot_output_file != NULL) && (_sg_mc_dot_output_file[0]!='\0')){ + fprintf(dot_output, "}\n"); + fclose(dot_output); + } + MC_UNSET_RAW_MEM; } void MC_assert(int prop) @@ -844,10 +849,10 @@ void MC_ignore_heap(void *address, size_t size){ 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; + ((xbt_mheap_t)std_heap)->heapinfo[region->block].busy_block.ignore++; }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; + ((xbt_mheap_t)std_heap)->heapinfo[region->block].busy_frag.ignore[region->fragment]++; } if(mc_heap_comparison_ignore == NULL){ @@ -931,6 +936,14 @@ void MC_remove_ignore_heap(void *address, size_t size){ } +void data_bss_ignore_variable_free(mc_data_bss_ignore_variable_t v){ + xbt_free(v); +} + +void data_bss_ignore_variable_free_voidp(void *v){ + data_bss_ignore_variable_free((mc_data_bss_ignore_variable_t) * (void **) v); +} + void MC_ignore_data_bss(void *address, size_t size){ int raw_mem_set = (mmalloc_get_current_heap() == raw_heap); @@ -938,7 +951,7 @@ void MC_ignore_data_bss(void *address, size_t size){ MC_SET_RAW_MEM; if(mc_data_bss_comparison_ignore == NULL) - mc_data_bss_comparison_ignore = xbt_dynar_new(sizeof(mc_data_bss_ignore_variable_t), NULL); + mc_data_bss_comparison_ignore = xbt_dynar_new(sizeof(mc_data_bss_ignore_variable_t), data_bss_ignore_variable_free_voidp); mc_data_bss_ignore_variable_t var = NULL; var = xbt_new0(s_mc_data_bss_ignore_variable_t, 1); @@ -960,6 +973,7 @@ void MC_ignore_data_bss(void *address, size_t size){ cursor = (start + end) / 2; current_var = (mc_data_bss_ignore_variable_t)xbt_dynar_get_as(mc_data_bss_comparison_ignore, cursor, mc_data_bss_ignore_variable_t); if(current_var->address == address){ + data_bss_ignore_variable_free(var); MC_UNSET_RAW_MEM; if(raw_mem_set) MC_SET_RAW_MEM; @@ -1036,7 +1050,15 @@ static size_t data_bss_ignore_size(void *address){ return 0; } +void stack_ignore_variable_free(mc_stack_ignore_variable_t v){ + xbt_free(v->var_name); + xbt_free(v->frame); + xbt_free(v); +} +void stack_ignore_variable_free_voidp(void *v){ + stack_ignore_variable_free((mc_stack_ignore_variable_t) * (void **) v); +} void MC_ignore_stack(const char *var_name, const char *frame_name){ @@ -1045,15 +1067,15 @@ void MC_ignore_stack(const char *var_name, const char *frame_name){ MC_SET_RAW_MEM; if(mc_stack_comparison_ignore == NULL) - mc_stack_comparison_ignore = xbt_dynar_new(sizeof(mc_stack_ignore_variable_t), NULL); - + mc_stack_comparison_ignore = xbt_dynar_new(sizeof(mc_stack_ignore_variable_t), stack_ignore_variable_free_voidp); + + 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_name); + 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_name); - xbt_dynar_insert_at(mc_stack_comparison_ignore, 0, &var); }else{ @@ -1068,6 +1090,7 @@ void MC_ignore_stack(const char *var_name, const char *frame_name){ 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_name) == 0){ if(strcmp(current_var->var_name, var_name) == 0){ + stack_ignore_variable_free(var); MC_UNSET_RAW_MEM; if(raw_mem_set) MC_SET_RAW_MEM; @@ -1084,11 +1107,6 @@ void MC_ignore_stack(const char *var_name, const char *frame_name){ 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_name); - if(strcmp(current_var->frame, frame_name) < 0) xbt_dynar_insert_at(mc_stack_comparison_ignore, cursor + 1, &var); else