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
65e0c47a
Commit
65e0c47a
authored
Oct 18, 2020
by
Vadapalli K Chaitanya
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update mm2.c
parent
45bbc0d8
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
261 additions
and
212 deletions
+261
-212
mm2.c
mm2.c
+261
-212
No files found.
mm2.c
View file @
65e0c47a
...
...
@@ -16,7 +16,6 @@
#include <string.h>
#include<stddef.h>
#include<stdint.h>
#include "mm.h"
#include "memlib.h"
...
...
@@ -73,6 +72,9 @@ uint32_t block_size;
}
block_end_meta_data_t
;
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)) \
...
...
@@ -143,10 +145,13 @@ void *init_mem_sbrk_break = NULL;
tree_node_t
**
root
=
NULL
;
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
*
temp
=
parent
->
left_node
;
...
...
@@ -162,17 +167,13 @@ void LL_rotate(tree_node_t *parent,tree_node_t *node)
else
{
block_meta_data_t
*
p_parent_meta_data
=
meta_data_block_addr
(
p_parent
);
block_meta_data_t
*
temp_meta_data
=
meta_data_block_addr
(
temp
);
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
;
}
...
...
@@ -184,22 +185,26 @@ void LL_rotate(tree_node_t *parent,tree_node_t *node)
parent
->
parent_node
=
temp
;
parent
->
left_node
=
temp_right
;
if
(
temp_right
!=
NULL
)
{
temp_right
->
parent_node
=
parent
;
}
}
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
*
temp
=
parent
->
left_node
;
block_meta_data_t
*
meta_data
=
meta_data_block_addr
(
temp
);
tree_node_t
*
node_left
=
node
->
left_node
;
tree_node_t
*
node_right
=
node
->
right_node
;
if
(
p_parent
==
NULL
)
{
*
root
=
node
;
...
...
@@ -208,15 +213,12 @@ void LR_Rotate(tree_node_t *parent,tree_node_t *node)
else
{
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
;
}
...
...
@@ -227,17 +229,29 @@ void LR_Rotate(tree_node_t *parent,tree_node_t *node)
node
->
left_node
=
temp
;
temp
->
parent_node
=
node
;
parent
->
left_node
=
node_right
;
if
(
node_right
!=
NULL
)
{
node_right
->
parent_node
=
parent
;
}
temp
->
right_node
=
node_left
;
if
(
node_left
!=
NULL
)
{
node_left
->
parent_node
=
temp
;
}
}
void
RR_Rotate
(
tree_node_t
*
parent
,
tree_node_t
*
node
)
{
printf
(
"Came to RR
\n
"
);
// printf("Came to RR1
\n");
tree_node_t
*
p_parent
=
parent
->
parent_node
;
tree_node_t
*
temp
=
parent
->
right_node
;
tree_node_t
*
temp_left
=
temp
->
left_node
;
if
(
p_parent
==
NULL
)
{
*
root
=
temp
;
...
...
@@ -245,35 +259,39 @@ void RR_Rotate(tree_node_t *parent,tree_node_t *node)
}
else
{
temp
->
parent_node
=
p_parent
;
block_meta_data_t
*
p_parent_meta_data
=
meta_data_block_addr
(
p_parent
);
block_meta_data_t
*
temp_meta_data
=
meta_data_block_addr
(
temp
);
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
;
}
}
temp
->
left_node
=
parent
;
parent
->
parent_node
=
temp
;
parent
->
right_node
=
temp_left
;
if
(
temp_left
!=
NULL
)
{
temp_left
->
parent_node
=
parent
;
}
}
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
*
temp
=
parent
->
right_node
;
tree_node_t
*
temp_right
=
temp
->
right_node
;
//
tree_node_t *temp_right=temp->right_node;
tree_node_t
*
node_left
=
node
->
left_node
;
tree_node_t
*
node_right
=
node
->
right_node
;
...
...
@@ -286,15 +304,12 @@ void RL_Rotate(tree_node_t *parent,tree_node_t *node)
else
{
node
->
parent_node
=
p_parent
;
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
);
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
;
}
...
...
@@ -306,51 +321,15 @@ void RL_Rotate(tree_node_t *parent,tree_node_t *node)
node
->
right_node
=
temp
;
temp
->
parent_node
=
node
;
parent
->
right_node
=
node_right
;
temp
->
left_node
=
node_left
;
}
void
rotate
(
tree_node_t
*
parent
,
tree_node_t
*
node
)
{
block_meta_data_t
*
parent_meta_data
=
meta_data_block_addr
(
parent
);
block_meta_data_t
*
node_meta_data
=
meta_data_block_addr
(
node
);
if
(
parent_meta_data
->
block_size
<
node_meta_data
->
block_size
)
if
(
node_right
!=
NULL
)
{
tree_node_t
*
temp
=
parent
->
right_node
;
block_meta_data_t
*
temp_meta_data
=
meta_data_block_addr
(
temp
);
if
(
temp_meta_data
->
block_size
<
node_meta_data
->
block_size
)
{
RR_Rotate
(
parent
,
node
);
}
else
{
RL_Rotate
(
parent
,
node
);
}
node_right
->
parent_node
=
parent
;
}
else
{
tree_node_t
*
temp
=
parent
->
left_node
;
block_meta_data_t
*
temp_meta_data
=
meta_data_block_addr
(
temp
);
if
(
temp_meta_data
->
block_size
<
node_meta_data
->
block_size
)
{
inorderTraversal
(
*
root
);
LR_Rotate
(
parent
,
node
);
}
else
temp
->
left_node
=
node_left
;
if
(
node_left
!=
NULL
)
{
LL_rotate
(
parent
,
node
);
}
node_left
->
parent_node
=
temp
;
}
}
int
getHeight
(
tree_node_t
*
node
)
...
...
@@ -361,8 +340,11 @@ int getHeight(tree_node_t *node)
}
int
left_height
=
getHeight
(
node
->
left_node
);
int
right_height
=
getHeight
(
node
->
right_node
);
return
1
+
(
left_height
>=
right_height
?
left_height
:
right_height
);
}
...
...
@@ -371,12 +353,11 @@ int get_balance(tree_node_t *node)
if
(
node
!=
NULL
)
{
inorderTraversal
(
*
root
);
int
left_height
=
getHeight
(
node
->
left_node
);
int
right_height
=
getHeight
(
node
->
right_node
);
return
(
left_height
-
right_height
);
}
...
...
@@ -384,24 +365,11 @@ int get_balance(tree_node_t *node)
}
void
inorderTraversal
(
tree_node_t
*
node
)
{
if
(
node
!=
NULL
)
{
block_meta_data_t
*
meta_data_block
=
meta_data_block_addr
(
node
);
printf
(
"Block size=%d
\n
"
,(
int
)
meta_data_block
->
block_size
);
inorderTraversal
(
node
->
left_node
);
inorderTraversal
(
node
->
right_node
);
}
}
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);
tree_node_t
*
tree_root
=*
root
;
if
(
tree_root
==
NULL
)
...
...
@@ -418,8 +386,10 @@ void insert_node_in_freelist(tree_node_t **root,block_meta_data_t *new_metadata_
block_meta_data_t
*
meta_data
=
meta_data_block_addr
(
temp
);
if
(
new_metadata_block
->
block_size
<=
meta_data
->
block_size
)
{
if
(
temp
->
left_node
==
NULL
)
{
new_metadata_block
->
tree_node
.
parent_node
=
temp
;
temp
->
left_node
=&
(
new_metadata_block
->
tree_node
);
temp
=
temp
->
left_node
;
...
...
@@ -434,6 +404,7 @@ void insert_node_in_freelist(tree_node_t **root,block_meta_data_t *new_metadata_
else
if
(
new_metadata_block
->
block_size
>
meta_data
->
block_size
)
{
if
(
temp
->
right_node
==
NULL
)
{
new_metadata_block
->
tree_node
.
parent_node
=
temp
;
...
...
@@ -452,15 +423,73 @@ void insert_node_in_freelist(tree_node_t **root,block_meta_data_t *new_metadata_
while
(
parent
)
{
int
b
=
get_balance
(
parent
);
if
(
b
>=
2
||
b
<=-
2
)
{
rotate
(
parent
,
temp
);
if
(
b
<-
1
)
{
if
(
parent
->
right_node
->
right_node
!=
NULL
)
{
if
(
parent
->
right_node
->
left_node
!=
NULL
)
{
if
(
getHeight
(
parent
->
right_node
->
left_node
)
>
getHeight
(
parent
->
right_node
->
right_node
))
{
RL_Rotate
(
parent
,
parent
->
right_node
->
left_node
);
}
parent
=
parent
->
parent_node
;
else
{
RR_Rotate
(
parent
,
parent
->
right_node
->
right_node
);
}
}
else
{
RR_Rotate
(
parent
,
parent
->
right_node
->
right_node
);
}
}
else
{
RL_Rotate
(
parent
,
parent
->
right_node
->
left_node
);
}
}
else
if
(
b
>
1
)
{
if
(
parent
->
left_node
->
left_node
!=
NULL
)
{
if
(
parent
->
left_node
->
right_node
!=
NULL
)
{
if
(
getHeight
(
parent
->
left_node
->
right_node
)
>
getHeight
(
parent
->
left_node
->
left_node
))
{
LR_Rotate
(
parent
,
parent
->
left_node
->
right_node
);
}
else
{
LL_rotate
(
parent
,
parent
->
left_node
->
left_node
);
}
}
else
{
LL_rotate
(
parent
,
parent
->
left_node
->
left_node
);
}
}
else
{
LR_Rotate
(
parent
,
parent
->
left_node
->
right_node
);
}
}
}
parent
=
parent
->
parent_node
;
}
}
}
...
...
@@ -482,14 +511,13 @@ block_meta_data_t *get_node_from_tree(tree_node_t **root,uint32_t reqsize)
return
meta_data
;
}
tree_node_t
*
get_min_node
(
tree_node_t
*
root
)
tree_node_t
*
get_min_node
(
tree_node_t
*
root
_node
)
{
tree_node_t
*
temp
=
root
;
tree_node_t
*
temp
=
root
_node
;
while
(
temp
->
left_node
!=
NULL
)
{
temp
=
temp
->
left_node
;
}
...
...
@@ -503,10 +531,6 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node)
tree_node_t
*
parent_node
=
del_node
->
parent_node
;
block_meta_data_t
*
parent_meta_data
=
meta_data_block_addr
(
parent_node
);
block_meta_data_t
*
del_meta_data
=
meta_data_block_addr
(
del_node
);
if
(
del_node
->
left_node
==
NULL
||
del_node
->
right_node
==
NULL
)
{
...
...
@@ -515,16 +539,17 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node)
//Deleting a leaf node
if
(
temp
==
NULL
)
{
if
(
parent_node
==
NULL
)
{
*
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
;
}
...
...
@@ -535,6 +560,7 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node)
else
{
if
(
del_node
->
left_node
!=
NULL
)
{
del_node
->
left_node
->
parent_node
=
parent_node
;
...
...
@@ -546,13 +572,14 @@ 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
->
left_node
;
}
else
else
if
(
parent_node
->
left_node
==
del_node
)
{
parent_node
->
left_node
=
del_node
->
left_node
;
}
}
...
...
@@ -568,12 +595,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
;
}
...
...
@@ -583,13 +610,31 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node)
while
(
parent_node
)
{
int
b
=
get_balance
(
parent_node
);
if
(
b
<-
1
)
{
if
(
parent_node
->
right_node
->
right_node
!=
NULL
)
{
if
(
parent_node
->
right_node
->
left_node
!=
NULL
)
{
if
(
getHeight
(
parent_node
->
right_node
->
left_node
)
>
getHeight
(
parent_node
->
right_node
->
right_node
))
{
RL_Rotate
(
parent_node
,
parent_node
->
right_node
->
left_node
);
}
else
{
RR_Rotate
(
parent_node
,
parent_node
->
right_node
->
right_node
);
}
}
else
{
RR_Rotate
(
parent_node
,
parent_node
->
right_node
->
right_node
);
}
}
else
{
RL_Rotate
(
parent_node
,
parent_node
->
right_node
->
left_node
);
...
...
@@ -599,8 +644,27 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node)
if
(
b
>
1
)
{
if
(
parent_node
->
left_node
->
left_node
!=
NULL
)
{
if
(
parent_node
->
left_node
->
right_node
!=
NULL
)
{
if
(
getHeight
(
parent_node
->
left_node
->
right_node
)
>
getHeight
(
parent_node
->
left_node
->
left_node
))
{
LR_Rotate
(
parent_node
,
parent_node
->
left_node
->
right_node
);
}
else
{
LL_rotate
(
parent_node
,
parent_node
->
left_node
->
left_node
);
}
}
else
{
LL_rotate
(
parent_node
,
parent_node
->
left_node
->
left_node
);
}
}
else
...
...
@@ -609,35 +673,21 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node)
}
}
parent_node
=
parent_node
->
parent_node
;
}
}
//Deleting node having two children
else
{
tree_node_t
*
min_right_node
=
get_min_node
(
del_node
->
right_node
);
remove_block_from_tree
(
root
,
min_right_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
)
...
...
@@ -653,6 +703,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
;
...
...
@@ -686,22 +754,30 @@ 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_meta_data_t
*
new_block
=
(
block_meta_data_t
*
)
NEXT_META_BLOCK_BY_SIZE
(
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
;
if
(
meta_data_block
->
is_free
==
MM_TRUE
)
meta_data_block
->
is_free
=
MM_FALSE
;
if
(
c
==
0
)
meta_data_block
->
next_block
=
free_block
->
next_block
->
next_block
;
else
meta_data_block
->
next_block
=
free_block
->
next_block
;
new_block
->
block_size
=
(
uint32_t
)
final_remain
;
if
(
final_remain
<
META_DATA_OVERHEAD
)
{
if
(
meta_data_block
->
next_block
)
meta_data_block
->
next_block
->
prev_block
=
meta_data_block
;
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
->
is_free
=
MM_TRUE
;
mm_bind_blocks_for_allocation
(
meta_data_block
,
new_block
);
assert
(
meta_data_block
->
next_block
->
block_size
==
new_block
->
block_size
);
block_end_meta_data_t
*
new_end_meta_data_block
=
(
block_end_meta_data_t
*
)
end_meta_data_addr
(
new_block
);
new_end_meta_data_block
->
block_size
=
new_block
->
block_size
;
if
(
new_block
->
next_block
&&
new_block
->
next_block
->
is_free
==
MM_TRUE
)
merge_free_blocks
(
new_block
,
new_block
->
next_block
);
if
(
new_block
->
prev_block
&&
new_block
->
prev_block
->
is_free
==
MM_TRUE
)
merge_free_blocks
(
new_block
,
new_block
->
prev_block
);
insert_node_in_freelist
(
root
,
new_block
);
}
...
...
@@ -709,10 +785,11 @@ 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
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
);
size_t
extra_size_req
=
(
int
)
no_of_pages_req
*
sys_page_size
;
void
*
store_brk
=
mem_heap_hi
()
+
1
;
void
*
brk
=
mem_sbrk
(
extra_size_req
);
if
(
*
(
int
*
)
brk
==
-
1
)
if
(
store_brk
==
brk
&&
*
(
int
*
)
brk
==
-
1
)
return
NULL
;
return
brk
;
}
...
...
@@ -769,6 +846,8 @@ void *mm_malloc(size_t size)
* Try to keep the heap size as small as possible.
*/
// printf("[IN MALLOC]\n");
if
(
size
<=
0
){
// Invalid request size
return
NULL
;
}
...
...
@@ -779,7 +858,6 @@ void *mm_malloc(size_t size)
//If No free block available then we will request new pages by calling mem_sbrk()
if
(
free_metadata_block
==
NULL
||
free_metadata_block
->
block_size
<
(
size
+
ALIGN
(
sizeof
(
block_end_meta_data_t
))
+
ALIGN
(
sizeof
(
block_meta_data_t
))))
{
void
*
brk
=
allocate_requested_size
(
size
);
if
(
brk
==
NULL
)
...
...
@@ -813,11 +891,15 @@ 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
;
// new_free_meta_block->block_size=(uint32_t)(extra_size_req-size-(2*sizeof(block_meta_data_t))-(2*sizeof(block_end_meta_data_t)));
new_free_meta_block
->
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
))));
new_free_meta_block
->
tree_node
=
init_free_node
();
...
...
@@ -831,13 +913,16 @@ 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
);
}
return
(
void
*
)((
char
*
)
next_meta_data_block
+
ALIGN
(
sizeof
(
block_meta_data_t
)));
}
assert
(
free_metadata_block
->
is_free
==
MM_TRUE
);
printf
(
"Free Data block size=%d
\n
"
,(
int
)
free_metadata_block
->
block_size
);
remove_block_from_tree
(
root
,
&
free_metadata_block
->
tree_node
);
uint32_t
remaining_size
=
free_metadata_block
->
block_size
-
size
;
...
...
@@ -849,9 +934,6 @@ void *mm_malloc(size_t size)
end_meta_data
->
block_size
=
size
;
remove_block_from_tree
(
root
,
&
free_metadata_block
->
tree_node
);
//Here we will created new block by splitting previous block
if
(
ALIGN
(
sizeof
(
block_meta_data_t
))
+
ALIGN
(
sizeof
(
block_end_meta_data_t
))
<
remaining_size
){
block_meta_data_t
*
next_meta_block
=
NULL
;
...
...
@@ -875,8 +957,6 @@ void *mm_malloc(size_t size)
mm_bind_blocks_for_allocation
(
free_metadata_block
,
next_meta_block
);
}
return
(
void
*
)((
char
*
)
free_metadata_block
+
ALIGN
(
sizeof
(
block_meta_data_t
)));
//mem_sbrk() is wrapper function for the sbrk() system call.
...
...
@@ -896,8 +976,10 @@ void mm_free(void *ptr)
* It should also keep track of all the free memory blocks.
* If the freed block is at the end of the heap then you can also decrease the heap size
* using 'mem_sbrk(-size)'.
*/
// 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
)));
assert
(
meta_data_block
->
is_free
==
MM_FALSE
);
...
...
@@ -941,6 +1023,8 @@ void mm_free(void *ptr)
{
remove_block_from_tree
(
root
,
&
prev_meta_data_block
->
tree_node
);
prev_meta_data_block
->
block_size
+=
get_internal_fragmented_size
(
prev_meta_data_block
,
meta_data_block
);
merge_free_blocks
(
prev_meta_data_block
,
meta_data_block
);
merged_meta_data_block
=
prev_meta_data_block
;
...
...
@@ -958,6 +1042,7 @@ void mm_free(void *ptr)
*/
void
*
mm_realloc
(
void
*
ptr
,
size_t
size
)
{
//printf("[IN REALLOC]\n");
size
=
((
size
+
7
)
/
8
)
*
8
;
//8-byte alignement
if
(
ptr
==
NULL
){
//memory was not previously allocated
...
...
@@ -970,7 +1055,6 @@ void *mm_realloc(void *ptr, size_t size)
}
/*
* This function should also copy the content of the previous memory block into the new block.
* You can use 'memcpy()' for this purpose.
...
...
@@ -982,7 +1066,7 @@ void *mm_realloc(void *ptr, size_t size)
block_meta_data_t
*
meta_data_block
=
(
block_meta_data_t
*
)((
char
*
)
ptr
-
ALIGN
(
sizeof
(
block_meta_data_t
)));
if
(
size
==
meta_data_block
->
block_size
)
return
(
void
*
)(
meta_data_block
+
1
);
return
(
void
*
)(
(
char
*
)
meta_data_block
+
ALIGN
(
sizeof
(
block_meta_data_t
))
);
if
(
size
<
meta_data_block
->
block_size
)
...
...
@@ -1054,67 +1138,64 @@ void *mm_realloc(void *ptr, size_t size)
if
(
req_rem_size
<=
inter_frag
)
{
// TODO check sizeof function once
meta_data_block
->
block_size
+=
req_rem_
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
);
end_meta_data_block
->
block_size
=
meta_data_block
->
block_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.
}
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
))
{
remove_block_from_tree
(
root
,
&
meta_data_block
->
next_block
->
tree_node
);
uint32_t
final_remain
=
TOTAL_COMBINE_SIZE_OF_BLOCKS
(
meta_data_block
->
next_block
)
-
req_rem_size
;
meta_data_block
->
block_size
+=
req_rem_size
;
req_rem_size
-=
inter_frag
;
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
;
if
(
final_remain
>
META_DATA_OVERHEAD
)
{
create_new_block_and_insert_into_freelist
(
meta_data_block
,
meta_data_block
->
next_block
,
final_remain
,
1
);
}
uint32_t
final_remain
=
TOTAL_COMBINE_SIZE_OF_BLOCKS
(
meta_data_block
->
next_block
)
-
req_rem_size
;
meta_data_block
->
block_size
=
size
;
//block_meta_data_t *store_head = meta_data_block->next_block;
meta_data_block
->
next_block
=
meta_data_block
->
next_block
->
next_block
;
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
->
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
)){
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
);
meta_data_block
->
prev_block
->
block_size
+=
req_rem_size
;
req_rem_size
-=
inter_frag
;
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
);
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
->
prev_block
->
block_size
=
size
;
meta_data_block
=
meta_data_block
->
prev_block
;
if
(
final_remain
>
META_DATA_OVERHEAD
)
create_new_block_and_insert_into_freelist
(
meta_data_block
,
meta_data_block
->
next_block
,
final_remain
,
1
);
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
&&
meta_data_block
->
prev_block
&&
meta_data_block
->
prev_block
->
is_free
&&
\
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
=
abs
(
meta_data_block
->
prev_block
->
block_size
-
size
);
meta_data_block
->
prev_block
->
block_size
+=
req_rem_size
;
req_rem_size
-=
inter_frag
;
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
;
if
(
final_remain
>
META_DATA_OVERHEAD
)
create_new_block_and_insert_into_freelist
(
meta_data_block
,
meta_data_block
->
next_block
,
final_remain
,
0
);
meta_data_block
->
is_free
=
MM_FALSE
;
block_meta_data_t
*
store_head
=
meta_data_block
->
next_block
;
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
)));
}
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
)));
uint32_t
amount_to_be_copied
=
meta_data_block
->
block_size
;
...
...
@@ -1123,36 +1204,4 @@ void *mm_realloc(void *ptr, size_t size)
return
(
void
*
)((
char
*
)
new_meta_data_block
+
ALIGN
(
sizeof
(
block_meta_data_t
)));
}
mm_free
(
ptr
);
return
mem_sbrk
(
size
);
}
int
main
()
{
mm_init
();
void
*
p1
=
mm_malloc
(
40
);
void
*
p3
=
mm_malloc
(
60
);
void
*
p4
=
mm_malloc
(
100
);
void
*
p5
=
mm_malloc
(
20
);
void
*
p6
=
mm_malloc
(
90
);
void
*
p7
=
mm_malloc
(
3500
);
printf
(
"Above Call Executed
\n
"
);
// mm_free(p2);
mm_free
(
p4
);
mm_free
(
p6
);
mm_free
(
p1
);
// mm_free(p3);
// mm_free(p5);
// mm_free(p7);
printf
(
"[FINAL INORDER TRAVERSAL]
\n
"
);
inorderTraversal
(
*
root
);
//mm_free(p2);
//mm_free(p2);
//void *p4=mm_malloc(40);
return
0
;
}
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