+ }
+ i++;
+ }
+
+ 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){
+ heap_area_t area = NULL;
+ area = xbt_new0(s_heap_area_t, 1);
+ area->block = block;
+ area->fragment = fragment;
+ return area;
+}
+
+static int in_mc_comparison_ignore(int block, int fragment){
+
+ unsigned int cursor = 0;
+ int start = 0;
+ 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_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;
+ if(region->fragment < fragment)
+ start = cursor + 1;
+ if(region->fragment > fragment)
+ end = cursor - 1;
+ }
+ if(region->block < block)
+ start = cursor + 1;
+ if(region->block > block)
+ end = cursor - 1;
+ }
+
+ return 0;
+}
+
+static size_t heap_comparison_ignore_size(void *address){
+ unsigned int cursor = 0;
+ int start = 0;
+ 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_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)
+ start = cursor + 1;
+ if(region->address > address)
+ end = cursor - 1;
+ }
+
+ return 0;
+}
+
+
+int compare_area(void *area1, void* area2, xbt_dynar_t previous){
+
+ size_t i = 0, pointer_align = 0, ignore1 = 0, ignore2 = 0;
+ void *address_pointed1, *address_pointed2;
+ int res_compare;
+ size_t block1, frag1, block2, frag2, size;
+ int check_ignore = 0;
+
+ void *addr_block1, *addr_block2, *addr_frag1, *addr_frag2;
+ void *area1_to_compare, *area2_to_compare;
+
+ block1 = ((char*)area1 - (char*)((xbt_mheap_t)s_heap)->heapbase) / BLOCKSIZE + 1;
+ block2 = ((char*)area2 - (char*)((xbt_mheap_t)s_heap)->heapbase) / BLOCKSIZE + 1;
+
+ if(((char *)area1 < (char*)((xbt_mheap_t)s_heap)->heapbase) || (block1 > heapsize1) || (block1 < 1) || ((char *)area2 < (char*)((xbt_mheap_t)s_heap)->heapbase) || (block2 > heapsize2) || (block2 < 1))
+ return 1;
+
+ addr_block1 = ((void*) (((ADDR2UINT(block1)) - 1) * BLOCKSIZE + (char*)heapbase1));
+ addr_block2 = ((void*) (((ADDR2UINT(block2)) - 1) * BLOCKSIZE + (char*)heapbase2));
+
+ if(heapinfo1[block1].type == heapinfo2[block2].type){
+
+ if(heapinfo1[block1].type == -1){
+ return 0;
+ }else if(heapinfo1[block1].type == 0){
+ if(heapinfo1[block1].busy_block.size != heapinfo2[block2].busy_block.size)
+ return 1;
+ if(heapinfo1[block1].busy_block.busy_size != heapinfo2[block2].busy_block.busy_size)
+ return 1;
+ if(!add_heap_area_pair(previous, block1, -1, block2, -1))
+ return 0;
+
+ size = heapinfo1[block1].busy_block.busy_size;
+ frag1 = -1;
+ frag2 = -1;
+
+ area1_to_compare = addr_block1;
+ area2_to_compare = addr_block2;
+
+ if((ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)) && heapinfo1[block1].busy_block.ignore == 1)
+ check_ignore = 1;
+ }else{
+ frag1 = ((uintptr_t) (ADDR2UINT (area1) % (BLOCKSIZE))) >> heapinfo1[block1].type;
+ frag2 = ((uintptr_t) (ADDR2UINT (area2) % (BLOCKSIZE))) >> heapinfo2[block2].type;
+
+ if(heapinfo1[block1].busy_frag.frag_size[frag1] != heapinfo2[block2].busy_frag.frag_size[frag2])
+ return 1;
+ if(!add_heap_area_pair(previous, block1, frag1, block2, frag2))
+ return 0;
+
+ addr_frag1 = (void*) ((char *)addr_block1 + (frag1 << heapinfo1[block1].type));
+ addr_frag2 = (void*) ((char *)addr_block2 + (frag2 << heapinfo2[block2].type));
+
+ area1_to_compare = addr_frag1;
+ area2_to_compare = addr_frag2;
+
+ size = heapinfo1[block1].busy_frag.frag_size[frag1];
+
+ if((ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)) && heapinfo1[block1].busy_frag.ignore[frag1] == 1)
+ check_ignore = 1;
+ }
+ }else if((heapinfo1[block1].type > 0) && (heapinfo2[block2].type > 0)){
+ frag1 = ((uintptr_t) (ADDR2UINT (area1) % (BLOCKSIZE))) >> heapinfo1[block1].type;
+ frag2 = ((uintptr_t) (ADDR2UINT (area2) % (BLOCKSIZE))) >> heapinfo2[block2].type;
+
+ if(heapinfo1[block1].busy_frag.frag_size[frag1] != heapinfo2[block2].busy_frag.frag_size[frag2])
+ return 1;
+ if(!add_heap_area_pair(previous, block1, frag1, block2, frag2))
+ return 0;
+
+ addr_frag1 = (void*) ((char *)addr_block1 + (frag1 << heapinfo1[block1].type));
+ addr_frag2 = (void*) ((char *)addr_block2 + (frag2 << heapinfo2[block2].type));
+
+ area1_to_compare = addr_frag1;
+ area2_to_compare = addr_frag2;
+
+ size = heapinfo1[block1].busy_frag.frag_size[frag1];
+
+ if((ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)) && heapinfo1[block1].busy_frag.ignore[frag1] == 1)
+ check_ignore = 1;
+ }else{
+ return 1;
+ }
+
+ while(i<size){