XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mm_diff, xbt,
"Logging specific to mm_diff in mmalloc");
-extern char *xbt_binary_name;
-
xbt_dynar_t mc_heap_comparison_ignore;
xbt_dynar_t stacks_areas;
fprintf(stderr, "%d ---> %s\n",i, e.bt_strings[i] + 4);
}
}
-
}
void mmalloc_backtrace_fragment_display(void* heapinfo, int block, int frag){
mmalloc_backtrace_fragment_display(heap->heapinfo, block, frag_nb);
break;
}
-
}
-void *s_heap, *heapbase1, *heapbase2;
-malloc_info *heapinfo1, *heapinfo2;
-size_t heaplimit, heapsize1, heapsize2;
+void *s_heap = NULL, *heapbase1 = NULL, *heapbase2 = NULL;
+malloc_info *heapinfo1 = NULL, *heapinfo2 = NULL;
+size_t heaplimit = 0, heapsize1 = 0, heapsize2 = 0;
int ignore_done = 0;
void *addr_block1, *addr_block2, *addr_frag1, *addr_frag2;
void *real_addr_block1, *real_addr_block2;
char *stack_name;
- int nb_block1=0, nb_frag1=0, nb_block2=0, nb_frag2=0;
xbt_dynar_t previous = xbt_dynar_new(sizeof(heap_area_pair_t), heap_area_pair_free_voidp);
- int equal, res_compare;
+ int equal, res_compare = 0;
/* Init equal information */
i1 = 1;
while(i1<=heaplimit){
if(heapinfo1[i1].type == 0){
- if(heapinfo1[i1].busy_block.busy_size > 0)
- nb_block1++;
heapinfo1[i1].busy_block.equal_to = NULL;
}
if(heapinfo1[i1].type > 0){
for(j1=0; j1 < (size_t) (BLOCKSIZE >> heapinfo1[i1].type); j1++){
- if(heapinfo1[i1].busy_frag.frag_size[j1] > 0)
- nb_frag1++;
heapinfo1[i1].busy_frag.equal_to[j1] = NULL;
}
}
while(i2<=heaplimit){
if(heapinfo2[i2].type == 0){
- if(heapinfo2[i2].busy_block.busy_size > 0)
- nb_block2++;
heapinfo2[i2].busy_block.equal_to = NULL;
}
if(heapinfo2[i2].type > 0){
for(j2=0; j2 < (size_t) (BLOCKSIZE >> heapinfo2[i2].type); j2++){
- if(heapinfo2[i2].busy_frag.frag_size[j2] > 0)
- nb_frag2++;
heapinfo2[i2].busy_frag.equal_to[j2] = NULL;
}
}
i2++;
}
- if(nb_block1 != nb_block2 || nb_frag1 != nb_frag2){
- XBT_DEBUG("Different number of busy blocks (%d - %d) or busy fragments (%d - %d)", nb_block1, nb_block2, nb_frag1, nb_frag2);
- return 1;
+ /* Init equal information */
+ i1 = 1;
+
+ while(i1<=heaplimit){
+ if(heapinfo1[i1].type == 0){
+ heapinfo1[i1].busy_block.equal_to = -1;
+ }
+ if(heapinfo1[i1].type > 0){
+ for(j1=0; j1 < MAX_FRAGMENT_PER_BLOCK; j1++){
+ heapinfo1[i1].busy_frag.equal_to[j1] = -1;
+ }
+ }
+ i1++;
+ }
+
+ i2 = 1;
+
+ while(i2<=heaplimit){
+ if(heapinfo2[i2].type == 0){
+ heapinfo2[i2].busy_block.equal_to = -1;
+ }
+ if(heapinfo2[i2].type > 0){
+ for(j2=0; j2 < MAX_FRAGMENT_PER_BLOCK; j2++){
+ heapinfo2[i2].busy_frag.equal_to[j2] = -1;
+ }
+ }
+ i2++;
}
/* Check busy blocks*/
stack->process_name = strdup(stack_name);
stack->size = heapinfo1[i1].busy_block.busy_size;
xbt_dynar_push(*stack1, &stack);
+ res_compare = -1;
}
if(heapinfo1[i1].busy_block.busy_size == 0){
i2 = 1;
equal = 0;
+ res_compare = 0;
/* Try first to associate to same block in the other heap */
if(heapinfo2[current_block].type == heapinfo1[current_block].type){
stack->process_name = strdup(stack_name);
stack->size = heapinfo2[current_block].busy_block.busy_size;
xbt_dynar_push(*stack2, &stack);
+ res_compare = -1;
}
add_heap_area_pair(previous, current_block, -1, current_block, -1);
- if(ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)){
- if(in_mc_comparison_ignore((int)current_block, -1))
- res_compare = compare_area(addr_block1, addr_block2, heapinfo1[current_block].busy_block.busy_size, previous, 1);
- else
+ if(res_compare != -1){
+ if(ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)){
+ if(in_mc_comparison_ignore((int)current_block, -1))
+ res_compare = compare_area(addr_block1, addr_block2, heapinfo1[current_block].busy_block.busy_size, previous, 1);
+ else
+ res_compare = compare_area(addr_block1, addr_block2, heapinfo1[current_block].busy_block.busy_size, previous, 0);
+ }else{
res_compare = compare_area(addr_block1, addr_block2, heapinfo1[current_block].busy_block.busy_size, previous, 0);
- }else{
- res_compare = compare_area(addr_block1, addr_block2, heapinfo1[current_block].busy_block.busy_size, previous, 0);
+ }
}
- if(res_compare == 0){
+ if(res_compare == 0 || res_compare == -1){
for(k=1; k < heapinfo2[current_block].busy_block.size; k++)
heapinfo2[current_block+k].busy_block.equal_to = new_heap_area(i1, -1);
for(k=1; k < heapinfo1[current_block].busy_block.size; k++)
stack->process_name = strdup(stack_name);
stack->size = heapinfo2[i2].busy_block.busy_size;
xbt_dynar_push(*stack2, &stack);
+ res_compare = -1;
}
if(i2 == current_block){
/* Comparison */
add_heap_area_pair(previous, i1, -1, i2, -1);
- if(ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)){
- if(in_mc_comparison_ignore((int)i1, -1))
- res_compare = compare_area(addr_block1, addr_block2, heapinfo1[i1].busy_block.busy_size, previous, 1);
- else
+ if(res_compare != -1){
+ if(ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)){
+ if(in_mc_comparison_ignore((int)i1, -1))
+ res_compare = compare_area(addr_block1, addr_block2, heapinfo1[i1].busy_block.busy_size, previous, 1);
+ else
+ res_compare = compare_area(addr_block1, addr_block2, heapinfo1[i1].busy_block.busy_size, previous, 0);
+ }else{
res_compare = compare_area(addr_block1, addr_block2, heapinfo1[i1].busy_block.busy_size, previous, 0);
- }else{
- res_compare = compare_area(addr_block1, addr_block2, heapinfo1[i1].busy_block.busy_size, previous, 0);
+ }
}
- if(res_compare == 0){
+ if(res_compare == 0 || res_compare == -1){
for(k=1; k < heapinfo2[i2].busy_block.size; k++)
heapinfo2[i2+k].busy_block.equal_to = new_heap_area(i1, -1);
for(k=1; k < heapinfo1[i1].busy_block.size; k++)
xbt_dynar_free(&previous);
ignore_done = 0;
+ s_heap = NULL, heapbase1 = NULL, heapbase2 = NULL;
+ heapinfo1 = NULL, heapinfo2 = NULL;
+ heaplimit = 0, heapsize1 = 0, heapsize2 = 0;
return ((nb_diff1 > 0) || (nb_diff2 > 0));
-
}
static heap_area_t new_heap_area(int block, int fragment){