Commit 4e7cd6be authored by Vadapalli K Chaitanya's avatar Vadapalli K Chaitanya

Update mm2.c

parent b2a1eb7b
......@@ -74,6 +74,8 @@ uint32_t block_size;
int c=0;
int m=0;
#define NEXT_META_BLOCK_BY_SIZE(block_meta_data_ptr) \
(block_meta_data_t *)((char *)(block_meta_data_ptr)+ALIGN(sizeof(block_meta_data_t)) \
+ block_meta_data_ptr->block_size \
......@@ -171,11 +173,11 @@ void LL_rotate(tree_node_t *parent,tree_node_t *node)
temp->parent_node=p_parent;
if(temp_meta_data->block_size<=p_parent_meta_data->block_size)
if(p_parent->left_node==parent)
{
p_parent->left_node=temp;
}
else
else if(p_parent->right_node==parent)
{
p_parent->right_node=temp;
}
......@@ -221,11 +223,11 @@ void LR_Rotate(tree_node_t *parent,tree_node_t *node)
block_meta_data_t *p_parent_meta_data=meta_data_block_addr(p_parent);
block_meta_data_t *node_meta_data=meta_data_block_addr(node);
node->parent_node=p_parent;
if(node_meta_data->block_size<=p_parent_meta_data->block_size)
if(p_parent->left_node==parent)
{
p_parent->left_node=node;
}
else
else if(p_parent->right_node==parent)
{
p_parent->right_node=node;
}
......@@ -272,11 +274,11 @@ void RR_Rotate(tree_node_t *parent,tree_node_t *node)
block_meta_data_t *temp_meta_data=meta_data_block_addr(temp);
if(temp_meta_data->block_size<=p_parent_meta_data->block_size&&p_parent->left_node==NULL)
if(p_parent->left_node==parent)
{
p_parent->left_node=temp;
}
else
else if(p_parent->right_node==parent)
{
p_parent->right_node=temp;
}
......@@ -319,11 +321,11 @@ void RL_Rotate(tree_node_t *parent,tree_node_t *node)
block_meta_data_t *node_meta_data=meta_data_block_addr(node);
if(node_meta_data->block_size<=p_parent_meta_data->block_size&&p_parent->left_node==NULL)
if(p_parent->left_node==parent)
{
p_parent->left_node=node;
}
else
else if(p_parent->right_node==parent)
{
p_parent->right_node=node;
}
......@@ -369,8 +371,18 @@ int get_balance(tree_node_t *node)
int left_height=getHeight(node->left_node);
if(c==54)
{
printf("Left height=%d\n",left_height);
}
int right_height=getHeight(node->right_node);
if(c==54)
{
printf("Right height=%d\n",right_height);
}
return (left_height-right_height);
}
......@@ -626,13 +638,17 @@ void insert_node_in_freelist(tree_node_t **root,block_meta_data_t *new_metadata_
while(parent)
{
while(parent)
{
int b=get_balance(parent);
if(c==54)
{
printf("Balance=%d\n",b);
}
if(b>=2||b<=-2)
{
if(b<-1)
......@@ -796,11 +812,11 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node)
*root=NULL;
return;
}
if(parent_meta_data->block_size<del_meta_data->block_size)
else if(parent_node->right_node==del_node)
{
parent_node->right_node=NULL;
}
else
else if(parent_node->left_node==del_node)
{
parent_node->left_node=NULL;
}
......@@ -823,15 +839,12 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node)
del_node->parent_node=NULL;
return;
}
else if(parent_meta_data->block_size<del_meta_data->block_size)
else if(parent_node->right_node==del_node)
{
block_meta_data_t *left_meta_data=meta_data_block_addr(del_node->left_node);
printf("Left Node Size=%d\n",left_meta_data->block_size);
parent_node->right_node=del_node->left_node;
}
else
else if(parent_node->left_node==del_node)
{
parent_node->left_node=del_node->left_node;
......@@ -849,12 +862,12 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node)
del_node->parent_node=NULL;
return;
}
else if(parent_meta_data->block_size<del_meta_data->block_size)
else if(parent_node->right_node==del_node)
{
parent_node->right_node=del_node->right_node;
}
else
else if(parent_node->left_node==del_node)
{
parent_node->left_node=del_node->right_node;
}
......@@ -971,6 +984,7 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node)
//Deleting node having two children
else
{
m++;
/*
printf("Tree traversal of delete node\n");
......@@ -1022,16 +1036,49 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node)
//printf("Parent node pointer=%p\n",(void *)del_node->left_node->parent_node);
//exit(0);
tree_node_t *min_right_node=get_min_node(del_node->right_node);
//print
/*
if(min_right_node->parent_node==NULL)
{
if(find_node_in_tree(*root,min_right_node)==1)
{
printf("Node found\n");
}
else
{
printf("Node not found\n");
}
set_mappings(del_node);
exit(0);
}
*/
//printf("Del node address=%p\n",del_node);
//printf("min right node address=%p\n",min_right_node);
//printf("Before removing min right node parent node=%p\n",min_right_node->parent_node);
//tree_node_t *t1=min_right_node->parent_node;
//printf("Before removing min right node parent node left=%p\n",t1->left_node);
//printf("Before removing min right node parent node right=%p\n",t1->right_node);
remove_block_from_tree(root,min_right_node);
//printf("After removing min right node parent node=%p\n",min_right_node->parent_node);
//printf("After removing min right node parent node left=%p\n",t1->left_node);
//printf("After removing min right node parent node right=%p\n",t1->right_node);
//printf("Before removing min right node parent node left=%p\n",min_right_node->parent_node->left_node);
//printf("Before removing min right node parent node right=%p\n",min_right_node->parent_node->right_node);
//exit(0);
/*
printf("Tree traversal after right node removed\n");
......@@ -1040,23 +1087,6 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node)
tree_node_t *parent_node_1=del_node->parent_node;
block_meta_data_t *parent_meta_data_1=meta_data_block_addr(parent_node_1);
if(parent_node_1==NULL)
{
*root=min_right_node;
}
else if(parent_meta_data_1->block_size<del_meta_data->block_size)
{
parent_node_1->right_node=min_right_node;
}
else
{
parent_node_1->left_node=min_right_node;
}
min_right_node->left_node=del_node->left_node;
if(del_node->left_node!=NULL)
......@@ -1072,6 +1102,24 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node)
}
min_right_node->parent_node=parent_node_1;
if(parent_node_1==NULL)
{
*root=min_right_node;
}
else if(parent_node_1->right_node==del_node)
{
parent_node_1->right_node=min_right_node;
}
else if(parent_node_1->left_node==del_node)
{
parent_node_1->left_node=min_right_node;
}
}
del_node->left_node=NULL;
......@@ -1134,7 +1182,10 @@ void create_new_block_and_insert_into_freelist(block_meta_data_t *meta_data_bloc
void *allocate_requested_size(size_t size)
{
size_t sys_page_size=mem_pagesize();
int no_of_pages_req=((size+ALIGN(sizeof(block_end_meta_data_t))+ALIGN(sizeof(block_meta_data_t))+sys_page_size-1)/sys_page_size);
//int k=size+(2*ALIGN(sizeof(block_end_meta_data_t)))+(2*ALIGN(sizeof(block_meta_data_t)));
//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;
void *brk= mem_sbrk(extra_size_req);
if(*(int *)brk==-1)
......@@ -1207,6 +1258,8 @@ 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))))
{
printf("Came here\n");
void *brk = allocate_requested_size(size);
if(brk==NULL)
......@@ -1240,6 +1293,11 @@ void *mm_malloc(size_t size)
next_end_meta_data_block->block_size=next_meta_data_block->block_size;
int new_free_block_size=(uint32_t)((char *)mem_heap_hi()-(char *)brk+1-size-(2*(uint32_t)ALIGN(sizeof(block_meta_data_t)))-(2*(uint32_t)ALIGN(sizeof(block_end_meta_data_t))));
if(new_free_block_size>0)
{
block_meta_data_t *new_free_meta_block=NEXT_META_BLOCK_BY_SIZE(next_meta_data_block);
new_free_meta_block->is_free=MM_TRUE;
......@@ -1258,6 +1316,7 @@ void *mm_malloc(size_t size)
insert_node_in_freelist(root,new_free_meta_block);
mm_bind_blocks_for_allocation(next_meta_data_block,new_free_meta_block);
}
printf("Tree after malloc\n");
......
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