Commit ec74f885 authored by Shivaji's avatar Shivaji

except random, working

parent 4e7cd6be
...@@ -151,7 +151,7 @@ tree_node_t **root=NULL; ...@@ -151,7 +151,7 @@ tree_node_t **root=NULL;
void LL_rotate(tree_node_t *parent,tree_node_t *node) void LL_rotate(tree_node_t *parent,tree_node_t *node)
{ {
printf("Came to LL\n"); // printf("Came to LL\n");
tree_node_t *p_parent=parent->parent_node; tree_node_t *p_parent=parent->parent_node;
tree_node_t *temp=parent->left_node; tree_node_t *temp=parent->left_node;
...@@ -199,7 +199,7 @@ void LL_rotate(tree_node_t *parent,tree_node_t *node) ...@@ -199,7 +199,7 @@ void LL_rotate(tree_node_t *parent,tree_node_t *node)
void LR_Rotate(tree_node_t *parent,tree_node_t *node) void LR_Rotate(tree_node_t *parent,tree_node_t *node)
{ {
printf("Came to LR\n"); // printf("Came to LR\n");
tree_node_t *p_parent=parent->parent_node; tree_node_t *p_parent=parent->parent_node;
tree_node_t *temp=parent->left_node; tree_node_t *temp=parent->left_node;
...@@ -254,7 +254,7 @@ void LR_Rotate(tree_node_t *parent,tree_node_t *node) ...@@ -254,7 +254,7 @@ void LR_Rotate(tree_node_t *parent,tree_node_t *node)
void RR_Rotate(tree_node_t *parent,tree_node_t *node) void RR_Rotate(tree_node_t *parent,tree_node_t *node)
{ {
printf("Came to RR1\n"); // printf("Came to RR1\n");
tree_node_t *p_parent=parent->parent_node; tree_node_t *p_parent=parent->parent_node;
tree_node_t *temp=parent->right_node; tree_node_t *temp=parent->right_node;
tree_node_t *temp_left=temp->left_node; tree_node_t *temp_left=temp->left_node;
...@@ -301,7 +301,7 @@ void RR_Rotate(tree_node_t *parent,tree_node_t *node) ...@@ -301,7 +301,7 @@ void RR_Rotate(tree_node_t *parent,tree_node_t *node)
void RL_Rotate(tree_node_t *parent,tree_node_t *node) void RL_Rotate(tree_node_t *parent,tree_node_t *node)
{ {
printf("Came to RL\n"); // printf("Came to RL\n");
tree_node_t *p_parent=parent->parent_node; tree_node_t *p_parent=parent->parent_node;
tree_node_t *temp=parent->right_node; tree_node_t *temp=parent->right_node;
//tree_node_t *temp_right=temp->right_node; //tree_node_t *temp_right=temp->right_node;
...@@ -373,14 +373,14 @@ int get_balance(tree_node_t *node) ...@@ -373,14 +373,14 @@ int get_balance(tree_node_t *node)
if(c==54) if(c==54)
{ {
printf("Left height=%d\n",left_height); // printf("Left height=%d\n",left_height);
} }
int right_height=getHeight(node->right_node); int right_height=getHeight(node->right_node);
if(c==54) if(c==54)
{ {
printf("Right height=%d\n",right_height); // printf("Right height=%d\n",right_height);
} }
...@@ -396,21 +396,21 @@ void printLevelOrder(tree_node_t* head) ...@@ -396,21 +396,21 @@ void printLevelOrder(tree_node_t* head)
{ {
if(c==122) if(c==122)
{ {
printf("Came to level order\n"); // printf("Came to level order\n");
} }
int h = getHeight(head); int h = getHeight(head);
if(c==122) if(c==122)
{ {
printf("Came to level order\n"); // printf("Came to level order\n");
} }
int i; int i;
for (i=1; i<=h; i++) for (i=1; i<=h; i++)
{ {
printGivenLevel(head, i); // printGivenLevel(head, i);
printf("\n"); // printf("\n");
} }
} }
...@@ -555,12 +555,12 @@ void printGivenLevel(tree_node_t* head, int level) ...@@ -555,12 +555,12 @@ void printGivenLevel(tree_node_t* head, int level)
if (level == 1) if (level == 1)
{ {
block_meta_data_t *meta_data=meta_data_block_addr(head); block_meta_data_t *meta_data=meta_data_block_addr(head);
printf("%d ", meta_data->block_size); // printf("%d ", meta_data->block_size);
} }
else if (level > 1) else if (level > 1)
{ {
printGivenLevel(head->left_node, level-1); // printGivenLevel(head->left_node, level-1);
printGivenLevel(head->right_node, level-1); // printGivenLevel(head->right_node, level-1);
} }
} }
...@@ -570,7 +570,7 @@ void inorderTraversal(tree_node_t *node) ...@@ -570,7 +570,7 @@ void inorderTraversal(tree_node_t *node)
{ {
inorderTraversal(node->left_node); inorderTraversal(node->left_node);
block_meta_data_t *meta_data_block=meta_data_block_addr(node); block_meta_data_t *meta_data_block=meta_data_block_addr(node);
printf("Block size=%d\n",(int)meta_data_block->block_size); // printf("Block size=%d\n",(int)meta_data_block->block_size);
inorderTraversal(node->right_node); inorderTraversal(node->right_node);
} }
...@@ -583,7 +583,7 @@ void inorderTraversal(tree_node_t *node) ...@@ -583,7 +583,7 @@ void inorderTraversal(tree_node_t *node)
void insert_node_in_freelist(tree_node_t **root,block_meta_data_t *new_metadata_block) void insert_node_in_freelist(tree_node_t **root,block_meta_data_t *new_metadata_block)
{ {
printf("Inserting block of size %d into free list\n",new_metadata_block->block_size); // printf("Inserting block of size %d into free list\n",new_metadata_block->block_size);
tree_node_t *tree_root=*root; tree_node_t *tree_root=*root;
if(tree_root==NULL) if(tree_root==NULL)
...@@ -646,7 +646,7 @@ void insert_node_in_freelist(tree_node_t **root,block_meta_data_t *new_metadata_ ...@@ -646,7 +646,7 @@ void insert_node_in_freelist(tree_node_t **root,block_meta_data_t *new_metadata_
if(c==54) if(c==54)
{ {
printf("Balance=%d\n",b); // printf("Balance=%d\n",b);
} }
if(b>=2||b<=-2) if(b>=2||b<=-2)
...@@ -660,40 +660,40 @@ void insert_node_in_freelist(tree_node_t **root,block_meta_data_t *new_metadata_ ...@@ -660,40 +660,40 @@ void insert_node_in_freelist(tree_node_t **root,block_meta_data_t *new_metadata_
{ {
if(getHeight(parent->right_node->left_node)>getHeight(parent->right_node->right_node)) if(getHeight(parent->right_node->left_node)>getHeight(parent->right_node->right_node))
{ {
printf("Before rotating\n"); // printf("Before rotating\n");
printLevelOrder(*root); // printLevelOrder(*root);
RL_Rotate(parent,parent->right_node->left_node); RL_Rotate(parent,parent->right_node->left_node);
printf("After rotating\n"); // printf("After rotating\n");
printLevelOrder(*root); // printLevelOrder(*root);
} }
else else
{ {
printf("Before rotating\n"); // printf("Before rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
RR_Rotate(parent,parent->right_node->right_node); RR_Rotate(parent,parent->right_node->right_node);
printf("After rotating\n"); // printf("After rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
} }
} }
else else
{ {
printf("Before rotating\n"); // printf("Before rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
RR_Rotate(parent,parent->right_node->right_node); RR_Rotate(parent,parent->right_node->right_node);
printf("After rotating\n"); // printf("After rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
} }
} }
else else
{ {
printf("Before rotating\n"); // printf("Before rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
RL_Rotate(parent,parent->right_node->left_node); RL_Rotate(parent,parent->right_node->left_node);
printf("After rotating\n"); // printf("After rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
} }
} }
...@@ -708,20 +708,20 @@ void insert_node_in_freelist(tree_node_t **root,block_meta_data_t *new_metadata_ ...@@ -708,20 +708,20 @@ void insert_node_in_freelist(tree_node_t **root,block_meta_data_t *new_metadata_
if(getHeight(parent->left_node->right_node)>getHeight(parent->left_node->left_node)) if(getHeight(parent->left_node->right_node)>getHeight(parent->left_node->left_node))
{ {
printf("Before rotating\n"); // printf("Before rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
LR_Rotate(parent,parent->left_node->right_node); LR_Rotate(parent,parent->left_node->right_node);
printf("After rotating\n"); // printf("After rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
} }
else else
{ {
printf("Before rotating\n"); // printf("Before rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
LL_rotate(parent,parent->left_node->left_node); LL_rotate(parent,parent->left_node->left_node);
printf("After rotating\n"); // printf("After rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
} }
...@@ -730,20 +730,20 @@ void insert_node_in_freelist(tree_node_t **root,block_meta_data_t *new_metadata_ ...@@ -730,20 +730,20 @@ void insert_node_in_freelist(tree_node_t **root,block_meta_data_t *new_metadata_
else else
{ {
printf("Before rotating\n"); // printf("Before rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
LL_rotate(parent,parent->left_node->left_node); LL_rotate(parent,parent->left_node->left_node);
printf("After rotating\n"); // printf("After rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
} }
} }
else else
{ {
printf("Before rotating\n"); // printf("Before rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
LR_Rotate(parent,parent->left_node->right_node); LR_Rotate(parent,parent->left_node->right_node);
printf("After rotating\n"); // printf("After rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
} }
...@@ -886,30 +886,30 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node) ...@@ -886,30 +886,30 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node)
{ {
if(getHeight(parent_node->right_node->left_node)>getHeight(parent_node->right_node->right_node)) if(getHeight(parent_node->right_node->left_node)>getHeight(parent_node->right_node->right_node))
{ {
printf("Before rotating\n"); // printf("Before rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
RL_Rotate(parent_node,parent_node->right_node->left_node); RL_Rotate(parent_node,parent_node->right_node->left_node);
printf("After rotating\n"); // printf("After rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
} }
else else
{ {
printf("Before rotating\n"); // printf("Before rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
RR_Rotate(parent_node,parent_node->right_node->right_node); RR_Rotate(parent_node,parent_node->right_node->right_node);
printf("After rotating\n"); // printf("After rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
} }
} }
else else
{ {
printf("Before rotating\n"); // printf("Before rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
RR_Rotate(parent_node,parent_node->right_node->right_node); RR_Rotate(parent_node,parent_node->right_node->right_node);
printf("After rotating\n"); // printf("After rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
} }
...@@ -918,10 +918,10 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node) ...@@ -918,10 +918,10 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node)
else else
{ {
printf("Before rotating\n"); // printf("Before rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
RL_Rotate(parent_node,parent_node->right_node->left_node); RL_Rotate(parent_node,parent_node->right_node->left_node);
printf("After rotating\n"); // printf("After rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
} }
} }
...@@ -936,20 +936,20 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node) ...@@ -936,20 +936,20 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node)
if(getHeight(parent_node->left_node->right_node)>getHeight(parent_node->left_node->left_node)) if(getHeight(parent_node->left_node->right_node)>getHeight(parent_node->left_node->left_node))
{ {
printf("Before rotating\n"); // printf("Before rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
LR_Rotate(parent_node,parent_node->left_node->right_node); LR_Rotate(parent_node,parent_node->left_node->right_node);
printf("After rotating\n"); // printf("After rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
} }
else else
{ {
printf("Before rotating\n"); // printf("Before rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
LL_rotate(parent_node,parent_node->left_node->left_node); LL_rotate(parent_node,parent_node->left_node->left_node);
printf("After rotating\n"); // printf("After rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
} }
...@@ -958,20 +958,20 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node) ...@@ -958,20 +958,20 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node)
else else
{ {
printf("Before rotating\n"); // printf("Before rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
LL_rotate(parent_node,parent_node->left_node->left_node); LL_rotate(parent_node,parent_node->left_node->left_node);
printf("After rotating\n"); // printf("After rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
} }
} }
else else
{ {
printf("Before rotating\n"); // printf("Before rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
LR_Rotate(parent_node,parent_node->left_node->right_node); LR_Rotate(parent_node,parent_node->left_node->right_node);
printf("After rotating\n"); // printf("After rotating\n");
printLevelOrder(*root); printLevelOrder(*root);
} }
...@@ -1153,18 +1153,20 @@ void merge_free_blocks(block_meta_data_t *first,block_meta_data_t *second) ...@@ -1153,18 +1153,20 @@ void merge_free_blocks(block_meta_data_t *first,block_meta_data_t *second)
} }
void create_new_block_and_insert_into_freelist(block_meta_data_t *meta_data_block,block_meta_data_t *free_block,uint32_t final_remain,int c) void create_new_block_and_insert_into_freelist(block_meta_data_t *meta_data_block,uint32_t final_remain)
{ {
block_end_meta_data_t *end_meta_data_block = (block_end_meta_data_t *)end_meta_data_addr(meta_data_block); block_end_meta_data_t *end_meta_data_block = (block_end_meta_data_t *)end_meta_data_addr(meta_data_block);
end_meta_data_block->block_size = meta_data_block->block_size; end_meta_data_block->block_size = meta_data_block->block_size;
block_meta_data_t *new_block = (block_meta_data_t *)NEXT_META_BLOCK_BY_SIZE(meta_data_block);
if(meta_data_block->is_free == MM_TRUE) if(meta_data_block->is_free == MM_TRUE)
meta_data_block->is_free = MM_FALSE; meta_data_block->is_free = MM_FALSE;
if(c == 0) if(final_remain < META_DATA_OVERHEAD)
meta_data_block->next_block = free_block->next_block->next_block; {
else if(meta_data_block->next_block)
meta_data_block->next_block = free_block->next_block; meta_data_block->next_block->prev_block = meta_data_block;
new_block->block_size = (uint32_t)final_remain; return;
}
block_meta_data_t *new_block = (block_meta_data_t *)NEXT_META_BLOCK_BY_SIZE(meta_data_block);
new_block->block_size = final_remain-META_DATA_OVERHEAD;
new_block->tree_node = init_free_node(); new_block->tree_node = init_free_node();
new_block->is_free = MM_TRUE; new_block->is_free = MM_TRUE;
mm_bind_blocks_for_allocation(meta_data_block, new_block); mm_bind_blocks_for_allocation(meta_data_block, new_block);
...@@ -1182,13 +1184,11 @@ void create_new_block_and_insert_into_freelist(block_meta_data_t *meta_data_bloc ...@@ -1182,13 +1184,11 @@ void create_new_block_and_insert_into_freelist(block_meta_data_t *meta_data_bloc
void *allocate_requested_size(size_t size) void *allocate_requested_size(size_t size)
{ {
size_t sys_page_size=mem_pagesize(); size_t sys_page_size=mem_pagesize();
//int k=size+(2*ALIGN(sizeof(block_end_meta_data_t)))+(2*ALIGN(sizeof(block_meta_data_t))); int no_of_pages_req=((size+2*ALIGN(sizeof(block_end_meta_data_t))+2*ALIGN(sizeof(block_meta_data_t))+sys_page_size-1)/sys_page_size);
//printf("Val=%d\n",k);
int no_of_pages_req=((size+(2*ALIGN(sizeof(block_end_meta_data_t)))+(2*ALIGN(sizeof(block_meta_data_t)))+sys_page_size-1)/sys_page_size);
printf("No of pages=%d\n",no_of_pages_req);
size_t extra_size_req=(int)no_of_pages_req*sys_page_size; size_t extra_size_req=(int)no_of_pages_req*sys_page_size;
void *store_brk = mem_heap_hi();
void *brk= mem_sbrk(extra_size_req); void *brk= mem_sbrk(extra_size_req);
if(*(int *)brk==-1) if(store_brk==brk && *(int *)brk == -1)
return NULL; return NULL;
return brk; return brk;
} }
...@@ -1246,7 +1246,7 @@ void *mm_malloc(size_t size) ...@@ -1246,7 +1246,7 @@ void *mm_malloc(size_t size)
*/ */
printf("[IN MALLOC]\n"); // printf("[IN MALLOC]\n");
if(size <= 0){ // Invalid request size if(size <= 0){ // Invalid request size
return NULL; return NULL;
} }
...@@ -1258,7 +1258,7 @@ void *mm_malloc(size_t size) ...@@ -1258,7 +1258,7 @@ void *mm_malloc(size_t size)
if(free_metadata_block==NULL||free_metadata_block->block_size<(size+ALIGN(sizeof(block_end_meta_data_t))+ALIGN(sizeof(block_meta_data_t)))) if(free_metadata_block==NULL||free_metadata_block->block_size<(size+ALIGN(sizeof(block_end_meta_data_t))+ALIGN(sizeof(block_meta_data_t))))
{ {
printf("Came here\n"); // printf("Came here\n");
void *brk = allocate_requested_size(size); void *brk = allocate_requested_size(size);
...@@ -1318,7 +1318,7 @@ void *mm_malloc(size_t size) ...@@ -1318,7 +1318,7 @@ void *mm_malloc(size_t size)
mm_bind_blocks_for_allocation(next_meta_data_block,new_free_meta_block); mm_bind_blocks_for_allocation(next_meta_data_block,new_free_meta_block);
} }
printf("Tree after malloc\n"); // printf("Tree after malloc\n");
printLevelOrder(*root); printLevelOrder(*root);
...@@ -1327,7 +1327,7 @@ void *mm_malloc(size_t size) ...@@ -1327,7 +1327,7 @@ void *mm_malloc(size_t size)
assert(free_metadata_block->is_free==MM_TRUE); assert(free_metadata_block->is_free==MM_TRUE);
printf("Free Data block size=%d\n",(int)free_metadata_block->block_size); // printf("Free Data block size=%d\n",(int)free_metadata_block->block_size);
remove_block_from_tree(root,&free_metadata_block->tree_node); remove_block_from_tree(root,&free_metadata_block->tree_node);
...@@ -1367,7 +1367,7 @@ void *mm_malloc(size_t size) ...@@ -1367,7 +1367,7 @@ void *mm_malloc(size_t size)
mm_bind_blocks_for_allocation(free_metadata_block,next_meta_block); mm_bind_blocks_for_allocation(free_metadata_block,next_meta_block);
} }
printf("Tree after malloc\n"); // printf("Tree after malloc\n");
printLevelOrder(*root); printLevelOrder(*root);
...@@ -1398,7 +1398,7 @@ void mm_free(void *ptr) ...@@ -1398,7 +1398,7 @@ void mm_free(void *ptr)
c++; c++;
printf("[IN FREE] %d\n",c); // printf("[IN FREE] %d\n",c);
block_meta_data_t *meta_data_block=(block_meta_data_t *)((char *)ptr-ALIGN(sizeof(block_meta_data_t))); block_meta_data_t *meta_data_block=(block_meta_data_t *)((char *)ptr-ALIGN(sizeof(block_meta_data_t)));
assert(meta_data_block->is_free==MM_FALSE); assert(meta_data_block->is_free==MM_FALSE);
...@@ -1579,56 +1579,57 @@ void *mm_realloc(void *ptr, size_t size) ...@@ -1579,56 +1579,57 @@ void *mm_realloc(void *ptr, size_t size)
return (void *)((char *)meta_data_block+ALIGN(sizeof(block_meta_data_t))); // Not handling adding remaining free part to free list because it is small in size to handle even headers, so skkipping. return (void *)((char *)meta_data_block+ALIGN(sizeof(block_meta_data_t))); // Not handling adding remaining free part to free list because it is small in size to handle even headers, so skkipping.
} }
if(meta_data_block->next_block && meta_data_block->next_block->is_free == MM_TRUE && \ if(meta_data_block->next_block && meta_data_block->next_block->is_free==MM_TRUE && meta_data_block->prev_block && meta_data_block->prev_block->is_free==MM_TRUE && \
req_rem_size <= TOTAL_COMBINED_SIZE_OF_BLOCKS(meta_data_block)+inter_frag)
{
remove_block_from_tree(root,&meta_data_block->prev_block->tree_node);
remove_block_from_tree(root,&meta_data_block->next_block->tree_node);
req_rem_size -= inter_frag;
inter_frag = get_internal_fragmented_size(meta_data_block->prev_block,meta_data_block);
req_rem_size -= inter_frag;
uint32_t final_remain = abs(meta_data_block->next_block->block_size+meta_data_block->prev_block->block_size+2*ALIGN(sizeof(block_end_meta_data_t)) \
+2*ALIGN(sizeof(block_meta_data_t)) - req_rem_size);
meta_data_block->prev_block->block_size = size;
meta_data_block = meta_data_block->prev_block;
block_meta_data_t *store_head = meta_data_block->next_block;
meta_data_block->next_block = meta_data_block->next_block->next_block->next_block;
meta_data_block->is_free = MM_FALSE;
memcpy((char *)(meta_data_block)+ALIGN(sizeof(block_meta_data_t)), (char *)(store_head)+ALIGN(sizeof(block_meta_data_t)),store_head->block_size);
create_new_block_and_insert_into_freelist(meta_data_block,final_remain);
return (void *)((char *)meta_data_block+ALIGN(sizeof(block_meta_data_t)));
}
if(meta_data_block->next_block && meta_data_block->next_block->is_free == MM_TRUE && \
req_rem_size <= (TOTAL_COMBINE_SIZE_OF_BLOCKS(meta_data_block->next_block)+inter_frag)) req_rem_size <= (TOTAL_COMBINE_SIZE_OF_BLOCKS(meta_data_block->next_block)+inter_frag))
{ {
remove_block_from_tree(root,&meta_data_block->next_block->tree_node); remove_block_from_tree(root,&meta_data_block->next_block->tree_node);
req_rem_size -= inter_frag; req_rem_size -= inter_frag;
uint32_t final_remain = TOTAL_COMBINE_SIZE_OF_BLOCKS(meta_data_block->next_block) - req_rem_size; uint32_t final_remain = TOTAL_COMBINE_SIZE_OF_BLOCKS(meta_data_block->next_block) - req_rem_size;
meta_data_block->block_size = size; meta_data_block->block_size = size;
// block_end_meta_data_t *end_meta_data_block = (block_end_meta_data_t *)end_meta_data_addr(meta_data_block); block_meta_data_t *store_head = meta_data_block->next_block;
// end_meta_data_block->block_size = meta_data_block->block_size; meta_data_block->next_block = meta_data_block->next_block->next_block;
create_new_block_and_insert_into_freelist(meta_data_block,meta_data_block->next_block,final_remain,1); create_new_block_and_insert_into_freelist(meta_data_block,final_remain);
return (void *)((char *)meta_data_block+ALIGN(sizeof(block_meta_data_t))); return (void *)((char *)meta_data_block+ALIGN(sizeof(block_meta_data_t)));
} }
if(meta_data_block->prev_block && meta_data_block->prev_block->is_free == MM_TRUE && \ if(meta_data_block->prev_block && meta_data_block->prev_block->is_free == MM_TRUE && \
req_rem_size <= (TOTAL_COMBINE_SIZE_OF_BLOCKS(meta_data_block->prev_block)+inter_frag)){ req_rem_size <= (TOTAL_COMBINE_SIZE_OF_BLOCKS(meta_data_block->prev_block)+inter_frag)){
inter_frag = get_internal_fragmented_size(meta_data_block->prev_block,meta_data_block);
remove_block_from_tree(root,&meta_data_block->prev_block->tree_node); remove_block_from_tree(root,&meta_data_block->prev_block->tree_node);
req_rem_size -= inter_frag; req_rem_size -= inter_frag;
meta_data_block->prev_block->block_size = size;
uint32_t final_remain = abs(TOTAL_COMBINE_SIZE_OF_BLOCKS(meta_data_block->prev_block) - req_rem_size); uint32_t final_remain = abs(TOTAL_COMBINE_SIZE_OF_BLOCKS(meta_data_block->prev_block) - req_rem_size);
memcpy((char *)(meta_data_block->prev_block)+ALIGN(sizeof(block_meta_data_t)), (char *)(meta_data_block)+ALIGN(sizeof(block_meta_data_t)),meta_data_block->block_size); meta_data_block->prev_block->block_size = size;
block_end_meta_data_t *end_meta_data_block = (block_end_meta_data_t *)end_meta_data_addr(meta_data_block); meta_data_block = meta_data_block->prev_block;
// end_meta_data_block->block_size = meta_data_block->block_size; meta_data_block->is_free = MM_FALSE;
// meta_data_block = meta_data_block->prev_block; block_meta_data_t *store_head = meta_data_block->next_block;
create_new_block_and_insert_into_freelist(meta_data_block,meta_data_block->next_block,final_remain,1); meta_data_block->next_block = meta_data_block->next_block->next_block;
memcpy((char *)(meta_data_block)+ALIGN(sizeof(block_meta_data_t)), (char *)(store_head)+ALIGN(sizeof(block_meta_data_t)),store_head->block_size);
create_new_block_and_insert_into_freelist(meta_data_block,final_remain);
return (void *)((char *)meta_data_block+ALIGN(sizeof(block_meta_data_t))); return (void *)((char *)meta_data_block+ALIGN(sizeof(block_meta_data_t)));
} }
if(meta_data_block->next_block && meta_data_block->next_block->is_free==MM_TRUE && meta_data_block->prev_block && meta_data_block->prev_block->is_free==MM_TRUE && \
req_rem_size <= TOTAL_COMBINED_SIZE_OF_BLOCKS(meta_data_block)+inter_frag)
{
remove_block_from_tree(root,&meta_data_block->prev_block->tree_node);
remove_block_from_tree(root,&meta_data_block->next_block->tree_node);
req_rem_size -= inter_frag;
meta_data_block->prev_block->block_size = size;
uint32_t final_remain = abs(meta_data_block->next_block->block_size+meta_data_block->prev_block->block_size+(uint32_t)ALIGN(sizeof(block_end_meta_data_t)) \
+(uint32_t)ALIGN(sizeof(block_meta_data_t)) - req_rem_size);
memcpy((char *)(meta_data_block->prev_block)+ALIGN(sizeof(block_meta_data_t)), (char *)(meta_data_block)+ALIGN(sizeof(block_meta_data_t)),meta_data_block->block_size);
// block_end_meta_data_t *end_meta_data_block = (block_end_meta_data_t *)end_meta_data_addr(meta_data_block);
// end_meta_data_block->block_size = meta_data_block->block_size;
meta_data_block = meta_data_block->prev_block;
create_new_block_and_insert_into_freelist(meta_data_block,meta_data_block->next_block,final_remain,0);
return (void *)((char *)meta_data_block+ALIGN(sizeof(block_meta_data_t)));
}
void *ptr = mm_malloc(size); void *ptr = mm_malloc(size);
block_meta_data_t *new_meta_data_block = (block_meta_data_t *)((char *)ptr-ALIGN(sizeof(block_meta_data_t))); block_meta_data_t *new_meta_data_block = (block_meta_data_t *)((char *)ptr-ALIGN(sizeof(block_meta_data_t)));
uint32_t amount_to_be_copied = meta_data_block->block_size; uint32_t amount_to_be_copied = meta_data_block->block_size;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment