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);
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);
}
-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){
return 1;
}
+ if(heap1->heapstats.chunks_used != heap2->heapstats.chunks_used){
+ XBT_DEBUG("Different number of chunks used in heap : %zu - %zu", heap1->heapstats.chunks_used, heap2->heapstats.chunks_used);
+ return 1;
+ }
+
/* Heap information */
heaplimit = ((struct mdesc *)heap1)->heaplimit;
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;
-
/* 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;
- }
-
/* Check busy blocks*/
i1 = 1;
add_heap_area_pair(previous, current_block, -1, current_block, -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((int)current_block, -1))
res_compare = compare_area(addr_block1, addr_block2, heapinfo1[current_block].busy_block.busy_size, previous, 1);
else
/* Comparison */
add_heap_area_pair(previous, i1, -1, i2, -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((int)i1, -1))
res_compare = compare_area(addr_block1, addr_block2, heapinfo1[i1].busy_block.busy_size, previous, 1);
else
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
/* 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
XBT_DEBUG("Different blocks or fragments in heap2 : %d", nb_diff2);
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));
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;
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)
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;
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
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
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
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{
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);