+static void heap_area_pair_free(heap_area_pair_t pair){
+ if (pair){
+ xbt_free(pair);
+ pair = NULL;
+ }
+}
+
+static void heap_area_pair_free_voidp(void *d)
+{
+ heap_area_pair_free((heap_area_pair_t) * (void **) d);
+}
+
+static int add_heap_area_pair(xbt_dynar_t list, int block1, int fragment1, int block2, int fragment2){
+
+ if(is_new_heap_area_pair(list, block1, fragment1, block2, fragment2)){
+ heap_area_pair_t pair = NULL;
+ pair = xbt_new0(s_heap_area_pair_t, 1);
+ pair->block1 = block1;
+ pair->fragment1 = fragment1;
+ pair->block2 = block2;
+ pair->fragment2 = fragment2;
+
+ xbt_dynar_push(list, &pair);
+
+ return 1;
+ }
+
+ return 0;
+}
+
+static int is_new_heap_area_pair(xbt_dynar_t list, int block1, int fragment1, int block2, int fragment2){
+
+ unsigned int cursor = 0;
+ heap_area_pair_t current_pair;
+
+ xbt_dynar_foreach(list, cursor, current_pair){
+ if(current_pair->block1 == block1 && current_pair->block2 == block2 && current_pair->fragment1 == fragment1 && current_pair->fragment2 == fragment2)
+ return 0;
+ }
+
+ return 1;
+}
+
+static void match_equals(xbt_dynar_t list, xbt_dynar_t *equals){
+
+ unsigned int cursor = 0;
+ heap_area_pair_t current_pair;
+ heap_area_t previous_area;
+
+ void *real_addr_block1, *real_addr_block2, *real_addr_frag1, *real_addr_frag2;
+
+ xbt_dynar_foreach(list, cursor, current_pair){
+
+ if(current_pair->fragment1 != -1){
+
+ real_addr_block1 = ((void*) (((ADDR2UINT((size_t)current_pair->block1)) - 1) * BLOCKSIZE + (char*)((xbt_mheap_t)s_heap)->heapbase));
+ real_addr_frag1 = (void*) ((char *)real_addr_block1 + (current_pair->fragment1 << heapinfo1[current_pair->block1].type));
+ real_addr_block2 = ((void*) (((ADDR2UINT((size_t)current_pair->block2)) - 1) * BLOCKSIZE + (char*)((xbt_mheap_t)s_heap)->heapbase));
+ real_addr_frag2 = (void*) ((char *)real_addr_block2 + (current_pair->fragment2 << heapinfo2[current_pair->block2].type));
+
+ if(heapinfo1[current_pair->block1].busy_frag.equal_to[current_pair->fragment1] != NULL){
+ remove_heap_equality(equals, 1, real_addr_frag1);
+ previous_area = heapinfo1[current_pair->block1].busy_frag.equal_to[current_pair->fragment1];
+ xbt_free(heapinfo2[previous_area->block].busy_frag.equal_to[previous_area->fragment]);
+ heapinfo2[previous_area->block].busy_frag.equal_to[previous_area->fragment] = NULL;
+ xbt_free(previous_area);
+ }
+ if(heapinfo2[current_pair->block2].busy_frag.equal_to[current_pair->fragment2] != NULL){
+ remove_heap_equality(equals, 2, real_addr_frag2);
+ previous_area = heapinfo2[current_pair->block2].busy_frag.equal_to[current_pair->fragment2];
+ xbt_free(heapinfo1[previous_area->block].busy_frag.equal_to[previous_area->fragment]);
+ heapinfo1[previous_area->block].busy_frag.equal_to[previous_area->fragment] = NULL;
+ xbt_free(previous_area);