From: Gabriel Corona Date: Tue, 25 Feb 2014 12:09:35 +0000 (+0100) Subject: Merge branch 'mc' into mc++ X-Git-Tag: v3_11~199^2~2^2~22^2~3 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/7f4665af2208aa2936e15597d20e7771a11a6dd7?hp=-c Merge branch 'mc' into mc++ --- 7f4665af2208aa2936e15597d20e7771a11a6dd7 diff --combined src/mc/mc_global.c index 987c6fc4fc,ceee7f9732..1badcb3676 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@@ -34,6 -34,8 +34,8 @@@ int _sg_mc_hash=0 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; @@@ -99,6 -101,20 +101,20 @@@ void _mc_cfg_cb_dot_output(const char * _sg_mc_dot_output_file= xbt_cfg_get_string(_sg_cfg_set, name); } + void _mc_cfg_cb_comms_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 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_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; @@@ -183,16 -199,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); @@@ -226,8 -243,9 +242,8 @@@ static void MC_make_functions_index(mc_ // 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; @@@ -297,9 -315,10 +313,9 @@@ static void MC_post_process_variables(m } 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) { @@@ -736,50 -755,72 +752,50 @@@ void MC_ignore_global_variable(const ch 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; @@@ -1216,7 -1257,8 +1232,8 @@@ void MC_replay(xbt_fifo_t stack, int st xbt_free(key); } } - xbt_dynar_reset(communications_pattern); + if(_sg_mc_comms_determinism || _sg_mc_send_determinism) + xbt_dynar_reset(communications_pattern); MC_UNSET_RAW_MEM; @@@ -1247,20 -1289,23 +1264,23 @@@ } } - if(req->call == SIMCALL_COMM_ISEND) - comm_pattern = 1; - else if(req->call == SIMCALL_COMM_IRECV) + 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) comm_pattern = 2; - + } + SIMIX_simcall_pre(req, value); - MC_SET_RAW_MEM; - if(comm_pattern != 0){ - get_comm_pattern(communications_pattern, req, comm_pattern); + 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); + } + MC_UNSET_RAW_MEM; + comm_pattern = 0; } - MC_UNSET_RAW_MEM; - - comm_pattern = 0; MC_wait_for_requests(); @@@ -1543,8 -1588,10 +1563,10 @@@ void MC_print_statistics(mc_stats_t sta fclose(dot_output); } if(initial_state_safety != NULL){ - // 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(_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; } diff --combined src/mc/mc_private.h index 8997755859,bda10fd28f..2b9ae41f4c --- a/src/mc/mc_private.h +++ b/src/mc/mc_private.h @@@ -341,7 -341,7 +341,7 @@@ struct s_mc_object_info char *start_exec, *end_exec; // Executable segment char *start_rw, *end_rw; // Read-write segment char *start_ro, *end_ro; // read-only segment - xbt_dict_t local_variables; // xbt_dict_t + xbt_dynar_t subprograms; // xbt_dynar_t xbt_dynar_t global_variables; // xbt_dynar_t xbt_dict_t types; // xbt_dict_t xbt_dict_t types_by_name; // xbt_dict_t (full defined type only) @@@ -443,8 -443,6 +443,8 @@@ typedef struct s_dw_variable dw_location_t location; void* address; + size_t start_scope; + }s_dw_variable_t, *dw_variable_t; struct s_dw_frame{ @@@ -497,6 -495,8 +497,8 @@@ typedef struct s_mc_comm_pattern int completed; unsigned long src_proc; unsigned long dst_proc; + const char *src_host; + const char *dst_host; char *rdv; size_t data_size; void *data; diff --combined src/xbt/mmalloc/mm_diff.c index 5717fa153c,ec4c90cbb8..76865c9283 --- a/src/xbt/mmalloc/mm_diff.c +++ b/src/xbt/mmalloc/mm_diff.c @@@ -812,8 -812,6 +812,8 @@@ static int compare_heap_area_with_type( case DW_TAG_base_type: case DW_TAG_enumeration_type: case DW_TAG_pointer_type: + case DW_TAG_reference_type: + case DW_TAG_rvalue_reference_type: case DW_TAG_structure_type: case DW_TAG_union_type: if(subtype->byte_size == 0){ /*declaration of the type, need the complete description */ @@@ -847,8 -845,6 +847,8 @@@ return res; } break; + case DW_TAG_reference_type: + case DW_TAG_rvalue_reference_type: case DW_TAG_pointer_type: if(type->dw_type_id && ((dw_type_t)xbt_dict_get_or_null(info->types, type->dw_type_id))->type == DW_TAG_subroutine_type){ addr_pointed1 = *((void **)(area1)); @@@ -1037,7 -1033,7 +1037,7 @@@ int compare_heap_area(void *area1, void type = type->subtype; } } - if((type->byte_size == DW_TAG_pointer_type) || ((type->type == DW_TAG_base_type) && type->name!=NULL && (!strcmp(type->name, "char")))) + if((type->type == DW_TAG_pointer_type) || ((type->type == DW_TAG_base_type) && type->name!=NULL && (!strcmp(type->name, "char")))) type_size = -1; else type_size = type->byte_size;