Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
M
MallocProject
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Vadapalli K Chaitanya
MallocProject
Commits
4e7cd6be
Commit
4e7cd6be
authored
Oct 18, 2020
by
Vadapalli K Chaitanya
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update mm2.c
parent
b2a1eb7b
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
97 additions
and
38 deletions
+97
-38
mm2.c
mm2.c
+97
-38
No files found.
mm2.c
View file @
4e7cd6be
...
...
@@ -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_siz
e
)
else
if
(
parent_node
->
right_node
==
del_nod
e
)
{
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_siz
e
)
else
if
(
parent_
node
->
right_node
==
del_nod
e
)
{
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_siz
e
)
else
if
(
parent_
node
->
right_node
==
del_nod
e
)
{
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
"
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment