+ 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){
+ #ifdef MC_DEBUG
+ if(is_diff == 0){
+ xbt_os_timer_stop(timer);
+ mc_comp_times->stacks_comparison_time = xbt_os_timer_elapsed(timer);
+ }
+ XBT_DEBUG("Different local variables between stacks %d", cursor + 1);
+ errors++;
+ is_diff = 1;
+ #else
+ xbt_dynar_free(&stacks1);
+ xbt_dynar_free(&stacks2);
+ xbt_dynar_free(&equals);
+
+ #ifdef MC_VERBOSE
+ XBT_VERB("Different local variables between stacks %d", cursor + 1);
+ #endif
+
+ xbt_os_timer_free(timer);
+ xbt_os_timer_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
+ }
+ cursor++;
+ }
+
+ xbt_dynar_free(&stacks1);
+ xbt_dynar_free(&stacks2);
+ xbt_dynar_free(&equals);
+
+ xbt_os_timer_free(timer);
+
+ #ifdef MC_VERBOSE
+ xbt_os_timer_stop(global_timer);
+ mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer);
+ #endif
+
+ xbt_os_timer_free(global_timer);
+
+ #ifdef MC_DEBUG
+ print_comparison_times();
+ #endif
+
+ if(!raw_mem)
+ MC_UNSET_RAW_MEM;
+
+ return errors > 0;
+
+}
+
+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 || strcmp(current_var->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;
+ }else if(strcmp(current_var->frame, frame) < 0){
+ start = cursor + 1;
+ }else 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 tokens2 = xbt_str_split(s2, NULL);
+
+ xbt_dynar_t s_tokens1, s_tokens2;
+ unsigned int cursor = 0;
+ void *addr1, *addr2;
+ char *ip1 = NULL, *ip2 = NULL;
+
+ while(cursor < xbt_dynar_length(tokens1)){
+ 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, 0, char *), "ip") == 0) && (strcmp(xbt_dynar_get_as(s_tokens2, 0, char *), "ip") == 0)){
+ xbt_free(ip1);
+ xbt_free(ip2);
+ ip1 = strdup(xbt_dynar_get_as(s_tokens1, 1, char *));
+ ip2 = strdup(xbt_dynar_get_as(s_tokens2, 1, char *));
+ }
+ 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){
+ if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_verbose))
+ XBT_VERB("Variable %s is different between stacks in %s : %s - %s", xbt_dynar_get_as(s_tokens1, 0, char *), ip1, xbt_dynar_get_as(s_tokens1, 1, char *), xbt_dynar_get_as(s_tokens2, 1, char *));
+ xbt_dynar_free(&s_tokens1);
+ xbt_dynar_free(&s_tokens2);
+ xbt_dynar_free(&tokens1);
+ xbt_dynar_free(&tokens2);
+ xbt_free(ip1);
+ xbt_free(ip2);
+ return 1;
+ }
+ }
+ }
+ xbt_dynar_free(&s_tokens1);
+ xbt_dynar_free(&s_tokens2);
+