+static void add_heap_equality(xbt_dynar_t equals, void *a1, void *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{
+
+ unsigned int cursor = 0;
+ int start = 0;
+ int end = xbt_dynar_length(equals) - 1;
+ heap_equality_t current_equality = NULL;
+
+ while(start <= end){
+ cursor = (start + end) / 2;
+ current_equality = (heap_equality_t)xbt_dynar_get_as(equals, cursor, heap_equality_t);
+ if(current_equality->address1 == a1){
+ if(current_equality->address2 == a2)
+ return;
+ if(current_equality->address2 < a2)
+ start = cursor + 1;
+ if(current_equality->address2 > a2)
+ end = cursor - 1;
+ }
+ if(current_equality->address1 < a1)
+ start = cursor + 1;
+ 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);
+ else
+ xbt_dynar_insert_at(equals, cursor, &he);
+
+ }
+
+}
+
+static void remove_heap_equality(xbt_dynar_t equals, int address, void *a){
+
+ unsigned int cursor = 0;
+ heap_equality_t current_equality;
+ int found = 0;
+
+ if(address == 1){
+
+ int start = 0;
+ int end = xbt_dynar_length(equals) - 1;
+
+
+ while(start <= end && found == 0){
+ cursor = (start + end) / 2;
+ current_equality = (heap_equality_t)xbt_dynar_get_as(equals, cursor, heap_equality_t);
+ if(current_equality->address1 == a)
+ found = 1;
+ if(current_equality->address1 < a)
+ start = cursor + 1;
+ if(current_equality->address1 > a)
+ end = cursor - 1;
+ }
+
+ if(found == 1)
+ xbt_dynar_remove_at(equals, cursor, NULL);
+
+ }else{
+
+ xbt_dynar_foreach(equals, cursor, current_equality){
+ if(current_equality->address2 == a){
+ found = 1;
+ break;
+ }
+ }
+
+ if(found == 1)
+ xbt_dynar_remove_at(equals, cursor, NULL);
+
+ }
+
+}
+
+int is_free_area(void *area, xbt_mheap_t heap){
+
+ void *sheap = (char *)mmalloc_get_current_heap() - STD_HEAP_SIZE - getpagesize();
+ malloc_info *heapinfo = (malloc_info *)((char *)heap + ((uintptr_t)((char *)heap->heapinfo - (char *)sheap)));
+ size_t heapsize = heap->heapsize;
+
+ /* Get block number */
+ size_t block = ((char*)area - (char*)((xbt_mheap_t)sheap)->heapbase) / BLOCKSIZE + 1;
+ size_t fragment;
+
+ /* Check if valid block number */
+ if((char *)area < (char*)((xbt_mheap_t)sheap)->heapbase || block > heapsize || block < 1)
+ return 0;
+
+ if(heapinfo[block].type < 0)
+ return 1;
+
+ if(heapinfo[block].type == 0)
+ return 0;
+
+ if(heapinfo[block].type > 0){
+ fragment = ((uintptr_t) (ADDR2UINT(area) % (BLOCKSIZE))) >> heapinfo[block].type;
+ if(heapinfo[block].busy_frag.frag_size[fragment] == 0)
+ return 1;
+ }
+
+ return 0;
+
+}
+
+static int equal_blocks(int b1, int b2){
+ if(heapinfo1[b1].busy_block.equal_to != NULL){
+ if(heapinfo2[b2].busy_block.equal_to != NULL){
+ if(((heap_area_t)(heapinfo1[b1].busy_block.equal_to))->block == b2 && ((heap_area_t)(heapinfo2[b2].busy_block.equal_to))->block == b1)
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static int equal_fragments(int b1, int f1, int b2, int f2){
+ if(heapinfo1[b1].busy_frag.equal_to[f1] != NULL){
+ if(heapinfo2[b2].busy_frag.equal_to[f2] != NULL){
+ if(((heap_area_t)(heapinfo1[b1].busy_frag.equal_to[f1]))->block == b2 && ((heap_area_t)(heapinfo2[b2].busy_frag.equal_to[f2]))->block == b1 && ((heap_area_t)(heapinfo1[b1].busy_frag.equal_to[f1]))->fragment == f2 && ((heap_area_t)(heapinfo2[b2].busy_frag.equal_to[f2]))->fragment == f1)
+ return 1;
+ }
+ }
+ return 0;
+}