static int compare_stack(stack_region_t s1, stack_region_t s2, void *sp1, void *sp2, void *heap1, void *heap2, xbt_dynar_t equals);
static int is_heap_equality(xbt_dynar_t equals, void *a1, void *a2);
-static size_t ignore(void *address);
+static size_t heap_ignore_size(void *address);
static void stack_region_free(stack_region_t s);
static void heap_equality_free(heap_equality_t e);
+static int is_stack_ignore_variable(char *frame, char *var_name);
static int compare_local_variables(char *s1, char *s2, xbt_dynar_t heap_equals);
-static size_t ignore(void *address){
+static size_t heap_ignore_size(void *address){
unsigned int cursor = 0;
int start = 0;
- int end = xbt_dynar_length(mc_comparison_ignore) - 1;
- mc_ignore_region_t region;
+ int end = xbt_dynar_length(mc_heap_comparison_ignore) - 1;
+ mc_heap_ignore_region_t region;
while(start <= end){
cursor = (start + end) / 2;
- region = (mc_ignore_region_t)xbt_dynar_get_as(mc_comparison_ignore, cursor, mc_ignore_region_t);
+ region = (mc_heap_ignore_region_t)xbt_dynar_get_as(mc_heap_comparison_ignore, cursor, mc_heap_ignore_region_t);
if(region->address == address)
return region->size;
if(region->address < address)
}
}
- XBT_DEBUG("Hamming distance between data program regions : %d", distance);
+ XBT_INFO("Hamming distance between data program regions : %d", distance);
return distance;
}
for(i=0; i<size; i++){
if(memcmp(((char *)d1) + i, ((char *)d2) + i, 1) != 0){
- if((ignore_size = ignore((char *)start_data_libsimgrid+i)) > 0){
+ if((ignore_size = heap_ignore_size((char *)start_data_libsimgrid+i)) > 0){
i = i + ignore_size;
continue;
}
}
}
- XBT_DEBUG("Hamming distance between data libsimgrid regions : %d", distance); fflush(NULL);
+ XBT_INFO("Hamming distance between data libsimgrid regions : %d", distance); fflush(NULL);
return distance;
}
}
}
- XBT_DEBUG("Hamming distance between heap regions : %d (total size : %zu)", distance, size);
+ XBT_INFO("Hamming distance between heap regions : %d (total size : %zu)", distance, size);
return distance;
}
return 1;
}
if(mmalloc_compare_heap((xbt_mheap_t)s1->regions[i]->data, (xbt_mheap_t)s2->regions[i]->data, &stacks1, &stacks2, &equals)){
- XBT_DEBUG("Different heap (mmalloc_compare)");
+ XBT_INFO("Different heap (mmalloc_compare)");
xbt_dynar_free(&stacks1);
xbt_dynar_free(&stacks2);
xbt_dynar_free(&equals);
return 1;
}
if(data_program_region_compare(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
- XBT_DEBUG("Different memcmp for data in program");
+ XBT_INFO("Different memcmp for data in program");
xbt_dynar_free(&stacks1);
xbt_dynar_free(&stacks2);
xbt_dynar_free(&equals);
if(diff >0){
diff_local = compare_local_variables(((mc_snapshot_stack_t)xbt_dynar_get_as(s1->stacks, cursor, mc_snapshot_stack_t))->local_variables->data, ((mc_snapshot_stack_t)xbt_dynar_get_as(s2->stacks, cursor, mc_snapshot_stack_t))->local_variables->data, equals);
if(diff_local > 0){
- XBT_DEBUG("Hamming distance between stacks : %d", diff);
+ XBT_INFO("Different local variables between stacks");
xbt_dynar_free(&stacks1);
xbt_dynar_free(&stacks2);
xbt_dynar_free(&equals);
MC_UNSET_RAW_MEM;
return 1;
}else{
- XBT_DEBUG("Local variables are equals in stack %d", cursor + 1);
+ XBT_INFO("Local variables are equals in stack %d", cursor + 1);
}
}else{
- XBT_DEBUG("Same stacks");
+ XBT_INFO("Hamming distance between stacks %d : %d", cursor + 1, diff);
}
cursor++;
}
}
+static int is_stack_ignore_variable(char *frame, char *var_name){
+
+ unsigned int cursor = 0;
+ int start = 0;
+ int end = xbt_dynar_length(mc_stack_comparison_ignore) - 1;
+ mc_stack_ignore_variable_t current_var;
+
+ 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->var_name, var_name) == 0)
+ return 1;
+ if(strcmp(current_var->var_name, var_name) < 0)
+ start = cursor + 1;
+ if(strcmp(current_var->var_name, var_name) > 0)
+ end = cursor - 1;
+ }
+ if(strcmp(current_var->frame, frame) < 0)
+ start = cursor + 1;
+ if(strcmp(current_var->frame, frame) > 0)
+ end = cursor - 1;
+ }
+
+ return 0;
+}
+
static int compare_local_variables(char *s1, char *s2, xbt_dynar_t heap_equals){
xbt_dynar_t tokens1 = xbt_str_split(s1, NULL);
xbt_dynar_t s_tokens1, s_tokens2;
unsigned int cursor = 0;
void *addr1, *addr2;
+ char *ip1 = NULL, *ip2 = NULL;
int diff = 0;
s_tokens1 = xbt_str_split(xbt_dynar_get_as(tokens1, cursor, char *), "=");
s_tokens2 = xbt_str_split(xbt_dynar_get_as(tokens2, cursor, char *), "=");
if(xbt_dynar_length(s_tokens1) > 1 && xbt_dynar_length(s_tokens2) > 1){
- if(strcmp(xbt_dynar_get_as(s_tokens1, 1, char *), xbt_dynar_get_as(s_tokens2, 1, char *)) != 0){
+ if((strcmp(xbt_dynar_get_as(s_tokens1, 0, char *), "ip") == 0) && (strcmp(xbt_dynar_get_as(s_tokens2, 0, char *), "ip") == 0)){
+ ip1 = strdup(xbt_dynar_get_as(s_tokens1, 1, char *));
+ ip2 = strdup(xbt_dynar_get_as(s_tokens2, 1, char *));
+ XBT_DEBUG("Ip1 : %s, Ip2 : %s", ip1, ip2);
+ }
+ if(strcmp(xbt_dynar_get_as(s_tokens1, 1, char *), xbt_dynar_get_as(s_tokens2, 1, char *)) != 0){
+ /* Ignore this variable ? */
+ if(is_stack_ignore_variable(ip1, xbt_dynar_get_as(s_tokens1, 0, char *)) && is_stack_ignore_variable(ip2, xbt_dynar_get_as(s_tokens2, 0, char *))){
+ xbt_dynar_free(&s_tokens1);
+ xbt_dynar_free(&s_tokens2);
+ cursor++;
+ continue;
+ }
addr1 = (void *) strtoul(xbt_dynar_get_as(s_tokens1, 1, char *), NULL, 16);
addr2 = (void *) strtoul(xbt_dynar_get_as(s_tokens2, 1, char *), NULL, 16);
if(is_heap_equality(heap_equals, addr1, addr2) == 0){
- XBT_DEBUG("Variable %s is different between stacks : %s - %s", xbt_dynar_get_as(s_tokens1, 0, char *), xbt_dynar_get_as(s_tokens1, 1, char *), xbt_dynar_get_as(s_tokens2, 1, char *));
+ if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_debug))
+ XBT_DEBUG("Variable %s is different between stacks : %s - %s", xbt_dynar_get_as(s_tokens1, 0, char *), xbt_dynar_get_as(s_tokens1, 1, char *), xbt_dynar_get_as(s_tokens2, 1, char *));
+ else
+ XBT_INFO("Variable %s is different between stacks", xbt_dynar_get_as(s_tokens1, 0, char *));
diff++;
}
}
}
}else{
- XBT_DEBUG("Different size used between stacks");
+ XBT_INFO("Different size used between stacks");
return 1;
}
return nb_diff;
}
+int MC_compare_snapshots(void *s1, void *s2){
+
+ return simcall_mc_compare_snapshots(s1, s2);
+
+}