X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/fa89cb46ee9cce80179056e44c26ca5de4c4ac9c..7f4665af2208aa2936e15597d20e7771a11a6dd7:/src/mc/mc_global.c diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index f92085fc14..1badcb3676 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -35,6 +35,7 @@ int _sg_mc_max_depth=1000; int _sg_mc_visited=0; char *_sg_mc_dot_output_file = NULL; int _sg_mc_comms_determinism=0; +int _sg_mc_send_determinism=0; int user_max_depth_reached = 0; @@ -107,6 +108,13 @@ void _mc_cfg_cb_comms_determinism(const char *name, int pos) { _sg_mc_comms_determinism= xbt_cfg_get_boolean(_sg_cfg_set, name); } +void _mc_cfg_cb_send_determinism(const char *name, int pos) { + if (_sg_cfg_init_status && !_sg_do_model_check) { + xbt_die("You are specifying a value to enable/disable the detection of send-determinism in the communications schemes 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_send_determinism= xbt_cfg_get_boolean(_sg_cfg_set, name); +} + /* MC global data structures */ mc_state_t mc_current_state = NULL; char mc_replay_mode = FALSE; @@ -191,17 +199,16 @@ void dw_variable_free_voidp(void *t){ mc_object_info_t MC_new_object_info(void) { mc_object_info_t res = xbt_new0(s_mc_object_info_t, 1); - res->local_variables = xbt_dict_new_homogeneous(NULL); + res->subprograms = xbt_dynar_new(sizeof(dw_frame_t), NULL); res->global_variables = xbt_dynar_new(sizeof(dw_variable_t), dw_variable_free_voidp); res->types = xbt_dict_new_homogeneous(NULL); res->types_by_name = xbt_dict_new_homogeneous(NULL); return res; } - void MC_free_object_info(mc_object_info_t* info) { xbt_free(&(*info)->file_name); - xbt_dict_free(&(*info)->local_variables); + xbt_dynar_free(&(*info)->subprograms); xbt_dynar_free(&(*info)->global_variables); xbt_dict_free(&(*info)->types); xbt_dict_free(&(*info)->types_by_name); @@ -235,9 +242,8 @@ static void MC_make_functions_index(mc_object_info_t info) { // Populate the array: dw_frame_t frame = NULL; - xbt_dict_cursor_t cursor = NULL; - const char* name = NULL; - xbt_dict_foreach(info->local_variables, cursor, name, frame) { + unsigned cursor = 0; + xbt_dynar_foreach(info->subprograms, cursor, frame) { if(frame->low_pc==NULL) continue; s_mc_function_index_item_t entry; @@ -307,10 +313,9 @@ static void MC_post_process_variables(mc_object_info_t info) { } static void MC_post_process_functions(mc_object_info_t info) { - xbt_dict_cursor_t cursor = NULL; - char* key = NULL; + unsigned cursor = 0; dw_frame_t function = NULL; - xbt_dict_foreach(info->local_variables, cursor, key, function) { + xbt_dynar_foreach(info->subprograms, cursor, function) { unsigned cursor2 = 0; dw_variable_t variable = NULL; xbt_dynar_foreach(function->variables, cursor2, variable) { @@ -747,72 +752,50 @@ void MC_ignore_global_variable(const char *name){ MC_UNSET_RAW_MEM; } +static void MC_ignore_local_variable_in_object(const char *var_name, const char *frame_name, mc_object_info_t info) { + unsigned cursor2; + dw_frame_t frame; + int start, end; + int cursor = 0; + dw_variable_t current_var; + + xbt_dynar_foreach(info->subprograms, cursor2, frame) { + + if(frame_name && strcmp(frame_name, frame->name)) + continue; + + start = 0; + end = xbt_dynar_length(frame->variables) - 1; + while(start <= end){ + cursor = (start + end) / 2; + current_var = (dw_variable_t)xbt_dynar_get_as(frame->variables, cursor, dw_variable_t); + + int compare = strcmp(current_var->name, var_name); + if(compare == 0){ + xbt_dynar_remove_at(frame->variables, cursor, NULL); + start = 0; + end = xbt_dynar_length(frame->variables) - 1; + }else if(compare < 0){ + start = cursor + 1; + }else{ + end = cursor - 1; + } + } + } +} + void MC_ignore_local_variable(const char *var_name, const char *frame_name){ int raw_mem_set = (mmalloc_get_current_heap() == raw_heap); + if(strcmp(frame_name, "*") == 0) + frame_name = NULL; + MC_SET_RAW_MEM; - unsigned int cursor = 0; - dw_variable_t current_var; - int start, end; - if(strcmp(frame_name, "*") == 0){ /* Remove variable in all frames */ - xbt_dict_cursor_t dict_cursor; - char *current_frame_name; - dw_frame_t frame; - xbt_dict_foreach(mc_libsimgrid_info->local_variables, dict_cursor, current_frame_name, frame){ - start = 0; - end = xbt_dynar_length(frame->variables) - 1; - while(start <= end){ - cursor = (start + end) / 2; - current_var = (dw_variable_t)xbt_dynar_get_as(frame->variables, cursor, dw_variable_t); - if(strcmp(current_var->name, var_name) == 0){ - xbt_dynar_remove_at(frame->variables, cursor, NULL); - start = 0; - end = xbt_dynar_length(frame->variables) - 1; - }else if(strcmp(current_var->name, var_name) < 0){ - start = cursor + 1; - }else{ - end = cursor - 1; - } - } - } - xbt_dict_foreach(mc_binary_info->local_variables, dict_cursor, current_frame_name, frame){ - start = 0; - end = xbt_dynar_length(frame->variables) - 1; - while(start <= end){ - cursor = (start + end) / 2; - current_var = (dw_variable_t)xbt_dynar_get_as(frame->variables, cursor, dw_variable_t); - if(strcmp(current_var->name, var_name) == 0){ - xbt_dynar_remove_at(frame->variables, cursor, NULL); - start = 0; - end = xbt_dynar_length(frame->variables) - 1; - }else if(strcmp(current_var->name, var_name) < 0){ - start = cursor + 1; - }else{ - end = cursor - 1; - } - } - } - }else{ - xbt_dynar_t variables_list = ((dw_frame_t)xbt_dict_get_or_null( - mc_libsimgrid_info->local_variables, frame_name))->variables; - start = 0; - end = xbt_dynar_length(variables_list) - 1; - while(start <= end){ - cursor = (start + end) / 2; - current_var = (dw_variable_t)xbt_dynar_get_as(variables_list, cursor, dw_variable_t); - if(strcmp(current_var->name, var_name) == 0){ - xbt_dynar_remove_at(variables_list, cursor, NULL); - start = 0; - end = xbt_dynar_length(variables_list) - 1; - }else if(strcmp(current_var->name, var_name) < 0){ - start = cursor + 1; - }else{ - end = cursor - 1; - } - } - } + MC_ignore_local_variable_in_object(var_name, frame_name, mc_libsimgrid_info); + if(frame_name!=NULL) + MC_ignore_local_variable_in_object(var_name, frame_name, mc_binary_info); if(!raw_mem_set) MC_UNSET_RAW_MEM; @@ -962,12 +945,14 @@ void MC_init(){ MC_ignore_local_variable("_throw_ctx", "*"); MC_ignore_local_variable("ctx", "*"); + MC_ignore_local_variable("self", "simcall_BODY_mc_snapshot"); MC_ignore_local_variable("next_context", "smx_ctx_sysv_suspend_serial"); MC_ignore_local_variable("i", "smx_ctx_sysv_suspend_serial"); /* Ignore local variable about time used for tracing */ MC_ignore_local_variable("start_time", "*"); + MC_ignore_global_variable("compared_pointers"); MC_ignore_global_variable("mc_comp_times"); MC_ignore_global_variable("mc_snapshot_comparison_time"); MC_ignore_global_variable("mc_time"); @@ -1247,7 +1232,7 @@ void MC_replay(xbt_fifo_t stack, int start) xbt_free(key); } } - if(_sg_mc_comms_determinism) + if(_sg_mc_comms_determinism || _sg_mc_send_determinism) xbt_dynar_reset(communications_pattern); MC_UNSET_RAW_MEM; @@ -1279,7 +1264,7 @@ void MC_replay(xbt_fifo_t stack, int start) } } - if(_sg_mc_comms_determinism){ + if(_sg_mc_comms_determinism || _sg_mc_send_determinism){ if(req->call == SIMCALL_COMM_ISEND) comm_pattern = 1; else if(req->call == SIMCALL_COMM_IRECV) @@ -1288,7 +1273,7 @@ void MC_replay(xbt_fifo_t stack, int start) SIMIX_simcall_pre(req, value); - if(_sg_mc_comms_determinism){ + if(_sg_mc_comms_determinism || _sg_mc_send_determinism){ MC_SET_RAW_MEM; if(comm_pattern != 0){ get_comm_pattern(communications_pattern, req, comm_pattern); @@ -1577,9 +1562,11 @@ void MC_print_statistics(mc_stats_t stats) fprintf(dot_output, "}\n"); fclose(dot_output); } - if(initial_state_safety != NULL && _sg_mc_comms_determinism){ - XBT_INFO("Communication-deterministic : %s", !initial_state_safety->comm_deterministic ? "No" : "Yes"); - XBT_INFO("Send-deterministic : %s", !initial_state_safety->send_deterministic ? "No" : "Yes"); + if(initial_state_safety != NULL){ + if(_sg_mc_comms_determinism) + XBT_INFO("Communication-deterministic : %s", !initial_state_safety->comm_deterministic ? "No" : "Yes"); + if (_sg_mc_send_determinism) + XBT_INFO("Send-deterministic : %s", !initial_state_safety->send_deterministic ? "No" : "Yes"); } MC_UNSET_RAW_MEM; }