X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/fa02213cffba5b63cb6ee145dda085a4e4401407..a1ea25d2fc3acda3fdaad9e2fc2b03769fe234d5:/src/xbt/mmalloc/mm_diff.c diff --git a/src/xbt/mmalloc/mm_diff.c b/src/xbt/mmalloc/mm_diff.c index 8098a95dc0..019166d270 100644 --- a/src/xbt/mmalloc/mm_diff.c +++ b/src/xbt/mmalloc/mm_diff.c @@ -28,9 +28,10 @@ static void heap_area_pair_free_voidp(void *d); static int add_heap_area_pair(xbt_dynar_t list, int block1, int fragment1, int block2, int fragment2); static int is_new_heap_area_pair(xbt_dynar_t list, int block1, int fragment1, int block2, int fragment2); -static int compare_area(void *area1, void* area2, size_t size, xbt_dynar_t previous); +static int compare_area(void *area1, void* area2, size_t size, xbt_dynar_t previous, int check_ignore); static void match_equals(xbt_dynar_t list); +static int in_mmalloc_ignore(int block, int fragment); static size_t heap_comparison_ignore(void *address); void mmalloc_backtrace_block_display(void* heapinfo, int block){ @@ -88,6 +89,8 @@ void *s_heap, *heapbase1, *heapbase2; malloc_info *heapinfo1, *heapinfo2; size_t heaplimit, heapsize1, heapsize2; +int ignore_done; + int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2){ if(heap1 == NULL && heap1 == NULL){ @@ -121,7 +124,38 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2){ xbt_dynar_t previous = xbt_dynar_new(sizeof(heap_area_pair_t), heap_area_pair_free_voidp); - int equal; + int equal, res_compare; + + ignore_done = 0; + + /* 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*/ @@ -164,17 +198,28 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2){ } addr_block2 = ((void*) (((ADDR2UINT(i2)) - 1) * BLOCKSIZE + (char*)heapbase2)); - + /* Comparison */ add_heap_area_pair(previous, i1, -1, i2, -1); - if(!compare_area(addr_block1, addr_block2, heapinfo1[i1].busy_block.busy_size, previous)){ - for(k=0; k < heapinfo2[i2].busy_block.size; k++) + + if(ignore_done < xbt_dynar_length(mmalloc_ignore)){ + if(in_mmalloc_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); + } + + if(!res_compare){ + for(k=1; k < heapinfo2[i2].busy_block.size; k++) heapinfo2[i2+k].busy_block.equal_to = 1; - for(k=0; k < heapinfo1[i1].busy_block.size; k++) + for(k=1; k < heapinfo1[i1].busy_block.size; k++) heapinfo1[i1+k].busy_block.equal_to = 1; equal = 1; match_equals(previous); } + xbt_dynar_reset(previous); i2++; @@ -219,13 +264,23 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2){ /* Comparison */ add_heap_area_pair(previous, i1, j1, i2, j2); - if(!compare_area(addr_frag1, addr_frag2, heapinfo1[i1].busy_frag.frag_size[j1], previous)){ - heapinfo2[i2].busy_frag.equal_to[j2] = 1; - heapinfo1[i1].busy_frag.equal_to[j1] = 1; + + if(ignore_done < xbt_dynar_length(mmalloc_ignore)){ + if(in_mmalloc_ignore((int)i1, (int)j1)) + res_compare = compare_area(addr_frag1, addr_frag2, heapinfo1[i1].busy_frag.frag_size[j1], previous, 1); + else + res_compare = compare_area(addr_frag1, addr_frag2, heapinfo1[i1].busy_frag.frag_size[j1], previous, 0); + }else{ + res_compare = compare_area(addr_frag1, addr_frag2, heapinfo1[i1].busy_frag.frag_size[j1], previous, 0); + } + + if(!res_compare){ equal = 1; match_equals(previous); + xbt_dynar_reset(previous); break; } + xbt_dynar_reset(previous); } @@ -317,41 +372,38 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2){ } XBT_DEBUG("Different blocks or fragments in heap2 : %d\n", nb_diff2); - - - /* Reset equal information */ - i = 1; - while(i 0){ - for(j=0; j < MAX_FRAGMENT_PER_BLOCK; j++){ - heapinfo1[i].busy_frag.equal_to[j] = -1; - } - } - i++; - } + xbt_dynar_free(&previous); + + return ((nb_diff1 > 0) || (nb_diff2 > 0)); - i = 1; +} - while(i 0){ - for(j=0; j < MAX_FRAGMENT_PER_BLOCK; j++){ - heapinfo2[i].busy_frag.equal_to[j] = -1; - } +static int in_mmalloc_ignore(int block, int fragment){ + + unsigned int cursor = 0; + int start = 0; + int end = xbt_dynar_length(mmalloc_ignore) - 1; + mc_ignore_region_t region; + + while(start <= end){ + cursor = (start + end) / 2; + region = (mc_ignore_region_t)xbt_dynar_get_as(mmalloc_ignore, cursor, mc_ignore_region_t); + if(region->block == block){ + if(region->fragment == fragment) + return 1; + if(region->fragment < fragment) + start = cursor + 1; + if(region->fragment > fragment) + end = cursor - 1; } - i++; + if(region->block < block) + start = cursor + 1; + if(region->block > block) + end = cursor - 1; } - xbt_dynar_free(&previous); - - return ((nb_diff1 > 0) || (nb_diff2 > 0)); - + return 0; } static size_t heap_comparison_ignore(void *address){ @@ -375,7 +427,7 @@ static size_t heap_comparison_ignore(void *address){ } -static int compare_area(void *area1, void* area2, size_t size, xbt_dynar_t previous){ +static int compare_area(void *area1, void* area2, size_t size, xbt_dynar_t previous, int check_ignore){ size_t i = 0, pointer_align = 0, ignore1 = 0, ignore2 = 0; void *address_pointed1, *address_pointed2, *addr_block_pointed1, *addr_block_pointed2, *addr_frag_pointed1, *addr_frag_pointed2; @@ -386,13 +438,18 @@ static int compare_area(void *area1, void* area2, size_t size, xbt_dynar_t previ while(iheapbase + ((((char *)area1) + i) - (char *)heapbase1); - if((ignore1 = heap_comparison_ignore(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){ - i = i + ignore2; - continue; + 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){ + current_area2 = (char*)((xbt_mheap_t)s_heap)->heapbase + ((((char *)area2) + i) - (char *)heapbase2); + if((ignore2 = heap_comparison_ignore(current_area2)) == ignore1){ + i = i + ignore2; + ignore_done++; + continue; + } } + } if(memcmp(((char *)area1) + i, ((char *)area2) + i, 1) != 0){ @@ -426,8 +483,15 @@ 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)){ - - res_compare = compare_area(addr_block_pointed1, addr_block_pointed2, heapinfo1[block_pointed1].busy_block.busy_size, previous); + + if(ignore_done < xbt_dynar_length(mmalloc_ignore)){ + if(in_mmalloc_ignore(block_pointed1, -1)) + res_compare = compare_area(addr_block_pointed1, addr_block_pointed2, heapinfo1[block_pointed1].busy_block.busy_size, previous, 1); + else + res_compare = compare_area(addr_block_pointed1, addr_block_pointed2, heapinfo1[block_pointed1].busy_block.busy_size, previous, 0); + }else{ + res_compare = compare_area(addr_block_pointed1, addr_block_pointed2, heapinfo1[block_pointed1].busy_block.busy_size, previous, 0); + } if(res_compare) return 1; @@ -450,8 +514,15 @@ 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)){ - res_compare = compare_area(addr_frag_pointed1, addr_frag_pointed2, heapinfo1[block_pointed1].busy_frag.frag_size[frag_pointed1], previous); - + if(ignore_done < xbt_dynar_length(mmalloc_ignore)){ + if(in_mmalloc_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 + res_compare = compare_area(addr_frag_pointed1, addr_frag_pointed2, heapinfo1[block_pointed1].busy_frag.frag_size[frag_pointed1], previous, 0); + }else{ + res_compare = compare_area(addr_frag_pointed1, addr_frag_pointed2, heapinfo1[block_pointed1].busy_frag.frag_size[frag_pointed1], previous, 0); + } + if(res_compare) return 1; @@ -480,7 +551,14 @@ 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)){ - res_compare = compare_area(addr_frag_pointed1, addr_frag_pointed2, heapinfo1[block_pointed1].busy_frag.frag_size[frag_pointed1], previous); + if(ignore_done < xbt_dynar_length(mmalloc_ignore)){ + if(in_mmalloc_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 + res_compare = compare_area(addr_frag_pointed1, addr_frag_pointed2, heapinfo1[block_pointed1].busy_frag.frag_size[frag_pointed1], previous, 0); + }else{ + res_compare = compare_area(addr_frag_pointed1, addr_frag_pointed2, heapinfo1[block_pointed1].busy_frag.frag_size[frag_pointed1], previous, 0); + } if(res_compare) return 1;