X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/0e17ea09090a41fb603dd6fc5f8088db1878cb9b..399309d03009809ad8b891b24630e7b2e7b2345e:/src/xbt/mmalloc/mm_diff.c diff --git a/src/xbt/mmalloc/mm_diff.c b/src/xbt/mmalloc/mm_diff.c index efec23cec3..db24efae0b 100644 --- a/src/xbt/mmalloc/mm_diff.c +++ b/src/xbt/mmalloc/mm_diff.c @@ -13,9 +13,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mm_diff, xbt, "Logging specific to mm_diff in mmalloc"); -extern char *xbt_binary_name; - -xbt_dynar_t mc_comparison_ignore; +xbt_dynar_t mc_heap_comparison_ignore; xbt_dynar_t stacks_areas; static void heap_area_pair_free(heap_area_pair_t pair); @@ -28,7 +26,7 @@ static int compare_area(void *area1, void* area2, size_t size, xbt_dynar_t previ static void match_equals(xbt_dynar_t list, xbt_dynar_t *equals); static int in_mc_comparison_ignore(int block, int fragment); -static size_t heap_comparison_ignore(void *address); +static size_t heap_comparison_ignore_size(void *address); static void add_heap_equality(xbt_dynar_t *equals, void *a1, void *a2); static void remove_heap_equality(xbt_dynar_t *equals, int address, void *a); @@ -113,15 +111,14 @@ void mmalloc_backtrace_display(void *addr){ 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; +int ignore_done = 0; int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stack1, xbt_dynar_t *stack2, xbt_dynar_t *equals){ @@ -154,27 +151,20 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac 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; - - ignore_done = 0; + 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; } } @@ -185,23 +175,43 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac 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*/ @@ -228,6 +238,7 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac 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){ @@ -242,6 +253,7 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac 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){ @@ -259,20 +271,23 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac 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_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++) @@ -301,6 +316,7 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac 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){ @@ -331,16 +347,18 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac /* Comparison */ add_heap_area_pair(previous, i1, -1, i2, -1); - if(ignore_done < xbt_dynar_length(mc_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++) @@ -388,7 +406,7 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac add_heap_area_pair(previous, current_block, current_fragment, current_block, current_fragment); - if(ignore_done < xbt_dynar_length(mc_comparison_ignore)){ + if(ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)){ if(in_mc_comparison_ignore((int)current_block, (int)current_fragment)) res_compare = compare_area(addr_frag1, addr_frag2, heapinfo1[current_block].busy_frag.frag_size[current_fragment], previous, 1); else @@ -435,7 +453,7 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac /* Comparison */ add_heap_area_pair(previous, i1, j1, i2, j2); - if(ignore_done < xbt_dynar_length(mc_comparison_ignore)){ + if(ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)){ if(in_mc_comparison_ignore((int)i1, (int)j1)) res_compare = compare_area(addr_frag1, addr_frag2, heapinfo1[i1].busy_frag.frag_size[j1], previous, 1); else @@ -480,6 +498,8 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac mmalloc_backtrace_block_display((void*)heapinfo1, i); } nb_diff1++; + }else{ + xbt_free(heapinfo1[i].busy_block.equal_to); } } } @@ -494,6 +514,8 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac mmalloc_backtrace_fragment_display((void*)heapinfo1, i, j); } nb_diff1++; + }else{ + xbt_free(heapinfo1[i].busy_frag.equal_to[j]); } } } @@ -516,6 +538,8 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac mmalloc_backtrace_block_display((void*)heapinfo2, i); } nb_diff2++; + }else{ + xbt_free(heapinfo2[i].busy_block.equal_to); } } } @@ -530,6 +554,8 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac mmalloc_backtrace_fragment_display((void*)heapinfo2, i, j); } nb_diff2++; + }else{ + xbt_free(heapinfo2[i].busy_frag.equal_to[j]); } } } @@ -540,9 +566,12 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac XBT_DEBUG("Different blocks or fragments in heap2 : %d", nb_diff2); xbt_dynar_free(&previous); - - return ((nb_diff1 > 0) || (nb_diff2 > 0)); + 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){ @@ -557,12 +586,12 @@ static int in_mc_comparison_ignore(int block, int fragment){ 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->block == block){ if(region->fragment == fragment) return 1; @@ -580,15 +609,15 @@ static int in_mc_comparison_ignore(int block, int fragment){ return 0; } -static size_t heap_comparison_ignore(void *address){ +static size_t heap_comparison_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) @@ -614,9 +643,9 @@ static int compare_area(void *area1, void* area2, size_t size, xbt_dynar_t previ if(check_ignore){ current_area1 = (char*)((xbt_mheap_t)s_heap)->heapbase + ((((char *)area1) + i) - (char *)heapbase1); - if((ignore1 = heap_comparison_ignore(current_area1)) > 0){ + if((ignore1 = heap_comparison_ignore_size(current_area1)) > 0){ current_area2 = (char*)((xbt_mheap_t)s_heap)->heapbase + ((((char *)area2) + i) - (char *)heapbase2); - if((ignore2 = heap_comparison_ignore(current_area2)) == ignore1){ + if((ignore2 = heap_comparison_ignore_size(current_area2)) == ignore1){ i = i + ignore2; ignore_done++; continue; @@ -657,7 +686,7 @@ static int compare_area(void *area1, void* area2, size_t size, xbt_dynar_t previ if(add_heap_area_pair(previous, block_pointed1, -1, block_pointed2, -1)){ - if(ignore_done < xbt_dynar_length(mc_comparison_ignore)){ + if(ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)){ if(in_mc_comparison_ignore(block_pointed1, -1)) res_compare = compare_area(addr_block_pointed1, addr_block_pointed2, heapinfo1[block_pointed1].busy_block.busy_size, previous, 1); else @@ -685,7 +714,7 @@ static int compare_area(void *area1, void* area2, size_t size, xbt_dynar_t previ if(add_heap_area_pair(previous, block_pointed1, frag_pointed1, block_pointed2, frag_pointed2)){ - if(ignore_done < xbt_dynar_length(mc_comparison_ignore)){ + if(ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)){ if(in_mc_comparison_ignore(block_pointed1, frag_pointed1)) res_compare = compare_area(addr_frag_pointed1, addr_frag_pointed2, heapinfo1[block_pointed1].busy_frag.frag_size[frag_pointed1], previous, 1); else @@ -719,7 +748,7 @@ static int compare_area(void *area1, void* area2, size_t size, xbt_dynar_t previ if(add_heap_area_pair(previous, block_pointed1, frag_pointed1, block_pointed2, frag_pointed2)){ - if(ignore_done < xbt_dynar_length(mc_comparison_ignore)){ + if(ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)){ if(in_mc_comparison_ignore(block_pointed1, frag_pointed1)) res_compare = compare_area(addr_frag_pointed1, addr_frag_pointed2, heapinfo1[block_pointed1].busy_frag.frag_size[frag_pointed1], previous, 1); else @@ -1008,12 +1037,12 @@ static char * is_stack(void *address){ static void add_heap_equality(xbt_dynar_t *equals, void *a1, void *a2){ - heap_equality_t he = xbt_new0(s_heap_equality_t, 1); - he->address1 = a1; - he->address2 = a2; - if(xbt_dynar_is_empty(*equals)){ + heap_equality_t he = xbt_new0(s_heap_equality_t, 1); + he->address1 = a1; + he->address2 = a2; + xbt_dynar_insert_at(*equals, 0, &he); }else{ @@ -1039,6 +1068,10 @@ static void add_heap_equality(xbt_dynar_t *equals, void *a1, void *a2){ if(current_equality->address1 > a1) end = cursor - 1; } + + heap_equality_t he = xbt_new0(s_heap_equality_t, 1); + he->address1 = a1; + he->address2 = a2; if(current_equality->address1 < a1) xbt_dynar_insert_at(*equals, cursor + 1 , &he);