X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f6b0d23eaea9e39da091df3e74149c7e1e1ff4f6..45cf10e0c743664310be804ca1d8d25edd3a18a7:/src/mc/mc_compare.c diff --git a/src/mc/mc_compare.c b/src/mc/mc_compare.c index 2422ad6567..f57d5c2532 100644 --- a/src/mc/mc_compare.c +++ b/src/mc/mc_compare.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2012-2013 Da SimGrid Team. All rights reserved. */ +/* Copyright (c) 2012-2013. The SimGrid Team. + * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -15,7 +16,7 @@ typedef struct s_pointers_pair{ void *p2; }s_pointers_pair_t, *pointers_pair_t; -xbt_dynar_t compared_pointers; +__thread xbt_dynar_t compared_pointers; /************************** Free functions ****************************/ /********************************************************************/ @@ -128,7 +129,6 @@ static int compare_areas_with_type(void *area1, void *area2, xbt_dict_t types, x dw_type_t member, subtype, subsubtype; int elm_size, i, res, switch_types = 0; void *addr_pointed1, *addr_pointed2; - int pointed_area_size1, pointed_area_size2; switch(type->type){ case e_dw_base_type: @@ -181,7 +181,7 @@ static int compare_areas_with_type(void *area1, void *area2, xbt_dict_t types, x res = compare_areas_with_type((char *)area1 + (i*elm_size), (char *)area2 + (i*elm_size), other_types, types, type->dw_type_id, region_size, region_type, start_data, pointer_level); else res = compare_areas_with_type((char *)area1 + (i*elm_size), (char *)area2 + (i*elm_size), types, other_types, type->dw_type_id, region_size, region_type, start_data, pointer_level); - if(res != 0) + if(res == 1) return res; } break; @@ -194,8 +194,6 @@ static int compare_areas_with_type(void *area1, void *area2, xbt_dict_t types, x addr_pointed1 = *((void **)(area1)); addr_pointed2 = *((void **)(area2)); - if((addr_pointed1 == addr_pointed2) && ((pointed_area_size1 = get_pointed_area_size(addr_pointed1, 1)) != (pointed_area_size2 = get_pointed_area_size(addr_pointed2, 2)))) - return -1; if(addr_pointed1 == NULL && addr_pointed2 == NULL) return 0; if(already_compared_pointers(addr_pointed1, addr_pointed2) != -1) @@ -210,9 +208,9 @@ static int compare_areas_with_type(void *area1, void *area2, xbt_dict_t types, x if(type->dw_type_id == NULL) return (addr_pointed1 != addr_pointed2); else - return compare_areas_with_type(addr_pointed1, addr_pointed2, types, other_types, type->dw_type_id, region_size, region_type, start_data, pointer_level); + return compare_areas_with_type(addr_pointed1, addr_pointed2, types, other_types, type->dw_type_id, region_size, region_type, start_data, pointer_level); }else{ - return (addr_pointed1 != addr_pointed2); + return (addr_pointed1 != addr_pointed2); } } break; @@ -271,17 +269,17 @@ static int compare_global_variables(int region_type, mc_mem_region_t r1, mc_mem_ offset = (char *)current_var->address.address - (char *)start_data_libsimgrid; res = compare_areas_with_type((char *)r1->data + offset, (char *)r2->data + offset, types, other_types, current_var->type_origin, r1->size, region_type, start_data, 0); - if(res == -1){ - xbt_dynar_cursor_rm(variables, &cursor); - }else if(res == 1){ + if(res == 1){ XBT_VERB("Global variable %s (%p - %p) is different between snapshots", current_var->name, (char *)r1->data + offset, (char *)r2->data + offset); xbt_dynar_free(&compared_pointers); + compared_pointers = NULL; return 1; } } xbt_dynar_free(&compared_pointers); + compared_pointers = NULL; return 0; @@ -299,6 +297,7 @@ static int compare_local_variables(mc_snapshot_stack_t stack1, mc_snapshot_stack if(xbt_dynar_length(stack1->local_variables) != xbt_dynar_length(stack2->local_variables)){ XBT_VERB("Different number of local variables"); xbt_dynar_free(&compared_pointers); + compared_pointers = NULL; return 1; }else{ unsigned int cursor = 0; @@ -309,33 +308,53 @@ static int compare_local_variables(mc_snapshot_stack_t stack1, mc_snapshot_stack current_var2 = (local_variable_t)xbt_dynar_get_as(stack2->local_variables, cursor, local_variable_t); if(strcmp(current_var1->name, current_var2->name) != 0 || strcmp(current_var1->frame, current_var2->frame) != 0 || current_var1->ip != current_var2->ip){ xbt_dynar_free(&compared_pointers); + XBT_VERB("Different name of variable (%s - %s) or frame (%s - %s) or ip (%lu - %lu)", current_var1->name, current_var2->name, current_var1->frame, current_var2->frame, current_var1->ip, current_var2->ip); return 1; } offset1 = (char *)current_var1->address - (char *)std_heap; offset2 = (char *)current_var2->address - (char *)std_heap; if(current_var1->region == 1) - res = compare_areas_with_type( (char *)heap1 + offset1, (char *)heap2 + offset2, mc_variables_type_libsimgrid, mc_variables_type_binary, current_var1->type, 0, 1, start_data_libsimgrid, 0l); + res = compare_areas_with_type( (char *)heap1 + offset1, (char *)heap2 + offset2, mc_variables_type_libsimgrid, mc_variables_type_binary, current_var1->type, 0, 1, start_data_libsimgrid, 0); else - res = compare_areas_with_type( (char *)heap1 + offset1, (char *)heap2 + offset2, mc_variables_type_binary, mc_variables_type_libsimgrid, current_var1->type, 0, 2, start_data_binary, 0l); + res = compare_areas_with_type( (char *)heap1 + offset1, (char *)heap2 + offset2, mc_variables_type_binary, mc_variables_type_libsimgrid, current_var1->type, 0, 2, start_data_binary, 0); if(res == 1){ - XBT_VERB("Local variable %s (%p - %p) in frame %s is different between snapshots", current_var1->name, (char *)heap1 + offset1, (char *)heap2 + offset2, current_var1->frame); + XBT_VERB("Local variable %s (%p - %p) in frame %s is different between snapshots", current_var1->name,(char *)heap1 + offset1, (char *)heap2 + offset2, current_var1->frame); xbt_dynar_free(&compared_pointers); + compared_pointers = NULL; return res; } cursor++; } xbt_dynar_free(&compared_pointers); + compared_pointers = NULL; return 0; } } -int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ +int snapshot_compare(void *state1, void *state2){ - int raw_mem = (mmalloc_get_current_heap() == raw_heap); + mc_snapshot_t s1, s2; + int num1, num2; - MC_SET_RAW_MEM; - + if(_sg_mc_property_file && _sg_mc_property_file[0] != '\0'){ /* Liveness MC */ + s1 = ((mc_pair_t)state1)->graph_state->system_state; + s2 = ((mc_pair_t)state2)->graph_state->system_state; + num1 = ((mc_pair_t)state1)->num; + num2 = ((mc_pair_t)state2)->num; + /* Firstly compare automaton state */ + /*if(xbt_automaton_state_compare(((mc_pair_t)state1)->automaton_state, ((mc_pair_t)state2)->automaton_state) != 0) + return 1; + if(xbt_automaton_propositional_symbols_compare_value(((mc_pair_t)state1)->atomic_propositions, ((mc_pair_t)state2)->atomic_propositions) != 0) + return 1;*/ + }else{ /* Safety MC */ + s1 = ((mc_visited_state_t)state1)->system_state; + s2 = ((mc_visited_state_t)state2)->system_state; + num1 = ((mc_visited_state_t)state1)->num; + num2 = ((mc_visited_state_t)state2)->num; + } + int errors = 0; + int res_init; xbt_os_timer_t global_timer = xbt_os_timer_new(); xbt_os_timer_t timer = xbt_os_timer_new(); @@ -359,12 +378,12 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ xbt_os_walltimer_stop(timer); mc_comp_times->stacks_sizes_comparison_time = xbt_os_timer_elapsed(timer); } - XBT_DEBUG("Different size used in stacks : %zu - %zu", size_used1, size_used2); + XBT_DEBUG("(%d - %d) Different size used in stacks : %zu - %zu", num1, num2, size_used1, size_used2); errors++; is_diff = 1; #else #ifdef MC_VERBOSE - XBT_VERB("Different size used in stacks : %zu - %zu", size_used1, size_used2); + XBT_VERB("(%d - %d) Different size used in stacks : %zu - %zu", num1, num2, size_used1, size_used2); #endif xbt_os_walltimer_stop(timer); @@ -373,9 +392,6 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer); xbt_os_timer_free(global_timer); - if(!raw_mem) - MC_UNSET_RAW_MEM; - return 1; #endif } @@ -407,9 +423,6 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer); xbt_os_timer_free(global_timer); - if(!raw_mem) - MC_UNSET_RAW_MEM; - return 1; #endif } @@ -438,9 +451,6 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer); xbt_os_timer_free(global_timer); - if(!raw_mem) - MC_UNSET_RAW_MEM; - return 1; #endif } @@ -451,7 +461,27 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ #endif /* Init heap information used in heap comparison algorithm */ - init_heap_information((xbt_mheap_t)s1->regions[0]->data, (xbt_mheap_t)s2->regions[0]->data, s1->to_ignore, s2->to_ignore); + res_init = init_heap_information((xbt_mheap_t)s1->regions[0]->data, (xbt_mheap_t)s2->regions[0]->data, s1->to_ignore, s2->to_ignore); + if(res_init == -1){ + #ifdef MC_DEBUG + XBT_DEBUG("(%d - %d) Different heap information", num1, num2); + errors++; + #else + #ifdef MC_VERBOSE + XBT_VERB("(%d - %d) Different heap information", num1, num2); + #endif + + xbt_os_walltimer_stop(global_timer); + mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer); + xbt_os_timer_free(global_timer); + + return 1; + #endif + } + + #ifdef MC_DEBUG + xbt_os_walltimer_start(timer); + #endif /* Stacks comparison */ unsigned int cursor = 0; @@ -469,13 +499,13 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ xbt_os_walltimer_stop(timer); mc_comp_times->stacks_comparison_time = xbt_os_timer_elapsed(timer); } - XBT_DEBUG("Different local variables between stacks %d", cursor + 1); + XBT_DEBUG("(%d - %d) Different local variables between stacks %d", num1, num2, cursor + 1); errors++; is_diff = 1; #else #ifdef MC_VERBOSE - XBT_VERB("Different local variables between stacks %d", cursor + 1); + XBT_VERB("(%d - %d) Different local variables between stacks %d", num1, num2, cursor + 1); #endif reset_heap_information(); @@ -484,10 +514,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ xbt_os_walltimer_stop(global_timer); mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer); xbt_os_timer_free(global_timer); - - if(!raw_mem) - MC_UNSET_RAW_MEM; - + return 1; #endif } @@ -506,11 +533,11 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ #ifdef MC_DEBUG xbt_os_walltimer_stop(timer); mc_comp_times->binary_global_variables_comparison_time = xbt_os_timer_elapsed(timer); - XBT_DEBUG("Different global variables in binary"); + XBT_DEBUG("(%d - %d) Different global variables in binary", num1, num2); errors++; #else #ifdef MC_VERBOSE - XBT_VERB("Different global variables in binary"); + XBT_VERB("(%d - %d) Different global variables in binary", num1, num2); #endif reset_heap_information(); @@ -519,9 +546,6 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ xbt_os_walltimer_stop(global_timer); mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer); xbt_os_timer_free(global_timer); - - if(!raw_mem) - MC_UNSET_RAW_MEM; return 1; #endif @@ -539,11 +563,11 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ #ifdef MC_DEBUG xbt_os_walltimer_stop(timer); mc_comp_times->libsimgrid_global_variables_comparison_time = xbt_os_timer_elapsed(timer); - XBT_DEBUG("Different global variables in libsimgrid"); + XBT_DEBUG("(%d - %d) Different global variables in libsimgrid", num1, num2); errors++; #else #ifdef MC_VERBOSE - XBT_VERB("Different global variables in libsimgrid"); + XBT_VERB("(%d - %d) Different global variables in libsimgrid", num1, num2); #endif reset_heap_information(); @@ -552,14 +576,11 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ xbt_os_walltimer_stop(global_timer); mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer); xbt_os_timer_free(global_timer); - - if(!raw_mem) - MC_UNSET_RAW_MEM; return 1; #endif } - + #ifdef MC_DEBUG xbt_os_walltimer_start(timer); #endif @@ -570,12 +591,12 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ #ifdef MC_DEBUG xbt_os_walltimer_stop(timer); mc_comp_times->heap_comparison_time = xbt_os_timer_elapsed(timer); - XBT_DEBUG("Different heap (mmalloc_compare)"); + XBT_DEBUG("(%d - %d) Different heap (mmalloc_compare)", num1, num2); errors++; #else #ifdef MC_VERBOSE - XBT_VERB("Different heap (mmalloc_compare)"); + XBT_VERB("(%d - %d) Different heap (mmalloc_compare)", num1, num2); #endif reset_heap_information(); @@ -585,9 +606,6 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer); xbt_os_timer_free(global_timer); - if(!raw_mem) - MC_UNSET_RAW_MEM; - return 1; #endif }else{ @@ -612,9 +630,6 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ print_comparison_times(); #endif - if(!raw_mem) - MC_UNSET_RAW_MEM; - return errors > 0; }