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
ec74f885
Commit
ec74f885
authored
Oct 18, 2020
by
Shivaji
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
except random, working
parent
4e7cd6be
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
101 additions
and
100 deletions
+101
-100
mm2.c
mm2.c
+101
-100
No files found.
mm2.c
View file @
ec74f885
...
...
@@ -151,7 +151,7 @@ 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
;
...
...
@@ -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
)
{
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
;
...
...
@@ -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
)
{
printf
(
"Came to RR1
\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
;
...
...
@@ -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
)
{
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;
...
...
@@ -373,14 +373,14 @@ int get_balance(tree_node_t *node)
if
(
c
==
54
)
{
printf
(
"Left height=%d
\n
"
,
left_height
);
//
printf("Left height=%d\n",left_height);
}
int
right_height
=
getHeight
(
node
->
right_node
);
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)
{
if
(
c
==
122
)
{
printf
(
"Came to level order
\n
"
);
//
printf("Came to level order\n");
}
int
h
=
getHeight
(
head
);
if
(
c
==
122
)
{
printf
(
"Came to level order
\n
"
);
//
printf("Came to level order\n");
}
int
i
;
for
(
i
=
1
;
i
<=
h
;
i
++
)
{
printGivenLevel
(
head
,
i
);
printf
(
"
\n
"
);
//
printGivenLevel(head, i);
//
printf("\n");
}
}
...
...
@@ -555,12 +555,12 @@ void printGivenLevel(tree_node_t* head, int level)
if
(
level
==
1
)
{
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
)
{
printGivenLevel
(
head
->
left_node
,
level
-
1
);
printGivenLevel
(
head
->
right_node
,
level
-
1
);
//
printGivenLevel(head->left_node, level-1);
//
printGivenLevel(head->right_node, level-1);
}
}
...
...
@@ -570,7 +570,7 @@ void inorderTraversal(tree_node_t *node)
{
inorderTraversal
(
node
->
left_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
);
}
...
...
@@ -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
)
{
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
;
if
(
tree_root
==
NULL
)
...
...
@@ -646,7 +646,7 @@ void insert_node_in_freelist(tree_node_t **root,block_meta_data_t *new_metadata_
if
(
c
==
54
)
{
printf
(
"Balance=%d
\n
"
,
b
);
//
printf("Balance=%d\n",b);
}
if
(
b
>=
2
||
b
<=-
2
)
...
...
@@ -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
))
{
printf
(
"Before rotating
\n
"
);
printLevelOrder
(
*
root
);
//
printf("Before rotating\n");
//
printLevelOrder(*root);
RL_Rotate
(
parent
,
parent
->
right_node
->
left_node
);
printf
(
"After rotating
\n
"
);
printLevelOrder
(
*
root
);
//
printf("After rotating\n");
//
printLevelOrder(*root);
}
else
{
printf
(
"Before rotating
\n
"
);
//
printf("Before rotating\n");
printLevelOrder
(
*
root
);
RR_Rotate
(
parent
,
parent
->
right_node
->
right_node
);
printf
(
"After rotating
\n
"
);
//
printf("After rotating\n");
printLevelOrder
(
*
root
);
}
}
else
{
printf
(
"Before rotating
\n
"
);
//
printf("Before rotating\n");
printLevelOrder
(
*
root
);
RR_Rotate
(
parent
,
parent
->
right_node
->
right_node
);
printf
(
"After rotating
\n
"
);
//
printf("After rotating\n");
printLevelOrder
(
*
root
);
}
}
else
{
printf
(
"Before rotating
\n
"
);
//
printf("Before rotating\n");
printLevelOrder
(
*
root
);
RL_Rotate
(
parent
,
parent
->
right_node
->
left_node
);
printf
(
"After rotating
\n
"
);
//
printf("After rotating\n");
printLevelOrder
(
*
root
);
}
}
...
...
@@ -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
))
{
printf
(
"Before rotating
\n
"
);
//
printf("Before rotating\n");
printLevelOrder
(
*
root
);
LR_Rotate
(
parent
,
parent
->
left_node
->
right_node
);
printf
(
"After rotating
\n
"
);
//
printf("After rotating\n");
printLevelOrder
(
*
root
);
}
else
{
printf
(
"Before rotating
\n
"
);
//
printf("Before rotating\n");
printLevelOrder
(
*
root
);
LL_rotate
(
parent
,
parent
->
left_node
->
left_node
);
printf
(
"After rotating
\n
"
);
//
printf("After rotating\n");
printLevelOrder
(
*
root
);
}
...
...
@@ -730,20 +730,20 @@ void insert_node_in_freelist(tree_node_t **root,block_meta_data_t *new_metadata_
else
{
printf
(
"Before rotating
\n
"
);
//
printf("Before rotating\n");
printLevelOrder
(
*
root
);
LL_rotate
(
parent
,
parent
->
left_node
->
left_node
);
printf
(
"After rotating
\n
"
);
//
printf("After rotating\n");
printLevelOrder
(
*
root
);
}
}
else
{
printf
(
"Before rotating
\n
"
);
//
printf("Before rotating\n");
printLevelOrder
(
*
root
);
LR_Rotate
(
parent
,
parent
->
left_node
->
right_node
);
printf
(
"After rotating
\n
"
);
//
printf("After rotating\n");
printLevelOrder
(
*
root
);
}
...
...
@@ -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
))
{
printf
(
"Before rotating
\n
"
);
//
printf("Before rotating\n");
printLevelOrder
(
*
root
);
RL_Rotate
(
parent_node
,
parent_node
->
right_node
->
left_node
);
printf
(
"After rotating
\n
"
);
//
printf("After rotating\n");
printLevelOrder
(
*
root
);
}
else
{
printf
(
"Before rotating
\n
"
);
//
printf("Before rotating\n");
printLevelOrder
(
*
root
);
RR_Rotate
(
parent_node
,
parent_node
->
right_node
->
right_node
);
printf
(
"After rotating
\n
"
);
//
printf("After rotating\n");
printLevelOrder
(
*
root
);
}
}
else
{
printf
(
"Before rotating
\n
"
);
//
printf("Before rotating\n");
printLevelOrder
(
*
root
);
RR_Rotate
(
parent_node
,
parent_node
->
right_node
->
right_node
);
printf
(
"After rotating
\n
"
);
//
printf("After rotating\n");
printLevelOrder
(
*
root
);
}
...
...
@@ -918,10 +918,10 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node)
else
{
printf
(
"Before rotating
\n
"
);
//
printf("Before rotating\n");
printLevelOrder
(
*
root
);
RL_Rotate
(
parent_node
,
parent_node
->
right_node
->
left_node
);
printf
(
"After rotating
\n
"
);
//
printf("After rotating\n");
printLevelOrder
(
*
root
);
}
}
...
...
@@ -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
))
{
printf
(
"Before rotating
\n
"
);
//
printf("Before rotating\n");
printLevelOrder
(
*
root
);
LR_Rotate
(
parent_node
,
parent_node
->
left_node
->
right_node
);
printf
(
"After rotating
\n
"
);
//
printf("After rotating\n");
printLevelOrder
(
*
root
);
}
else
{
printf
(
"Before rotating
\n
"
);
//
printf("Before rotating\n");
printLevelOrder
(
*
root
);
LL_rotate
(
parent_node
,
parent_node
->
left_node
->
left_node
);
printf
(
"After rotating
\n
"
);
//
printf("After rotating\n");
printLevelOrder
(
*
root
);
}
...
...
@@ -958,20 +958,20 @@ void remove_block_from_tree(tree_node_t **root,tree_node_t *del_node)
else
{
printf
(
"Before rotating
\n
"
);
//
printf("Before rotating\n");
printLevelOrder
(
*
root
);
LL_rotate
(
parent_node
,
parent_node
->
left_node
->
left_node
);
printf
(
"After rotating
\n
"
);
//
printf("After rotating\n");
printLevelOrder
(
*
root
);
}
}
else
{
printf
(
"Before rotating
\n
"
);
//
printf("Before rotating\n");
printLevelOrder
(
*
root
);
LR_Rotate
(
parent_node
,
parent_node
->
left_node
->
right_node
);
printf
(
"After rotating
\n
"
);
//
printf("After rotating\n");
printLevelOrder
(
*
root
);
}
...
...
@@ -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
);
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
)
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
);
...
...
@@ -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
)
{
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)));
//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
);
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
();
void
*
brk
=
mem_sbrk
(
extra_size_req
);
if
(
*
(
int
*
)
brk
==
-
1
)
if
(
store_brk
==
brk
&&
*
(
int
*
)
brk
==
-
1
)
return
NULL
;
return
brk
;
}
...
...
@@ -1246,7 +1246,7 @@ void *mm_malloc(size_t size)
*/
printf
(
"[IN MALLOC]
\n
"
);
//
printf("[IN MALLOC]\n");
if
(
size
<=
0
){
// Invalid request size
return
NULL
;
}
...
...
@@ -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
))))
{
printf
(
"Came here
\n
"
);
//
printf("Came here\n");
void
*
brk
=
allocate_requested_size
(
size
);
...
...
@@ -1318,7 +1318,7 @@ void *mm_malloc(size_t size)
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
);
...
...
@@ -1327,7 +1327,7 @@ void *mm_malloc(size_t size)
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
);
...
...
@@ -1367,7 +1367,7 @@ void *mm_malloc(size_t size)
mm_bind_blocks_for_allocation
(
free_metadata_block
,
next_meta_block
);
}
printf
(
"Tree after malloc
\n
"
);
//
printf("Tree after malloc\n");
printLevelOrder
(
*
root
);
...
...
@@ -1398,7 +1398,7 @@ void mm_free(void *ptr)
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
)));
assert
(
meta_data_block
->
is_free
==
MM_FALSE
);
...
...
@@ -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.
}
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
))
{
remove_block_from_tree
(
root
,
&
meta_data_block
->
next_block
->
tree_node
);
req_rem_size
-=
inter_frag
;
uint32_t
final_remain
=
TOTAL_COMBINE_SIZE_OF_BLOCKS
(
meta_data_block
->
next_block
)
-
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
;
create_new_block_and_insert_into_freelist
(
meta_data_block
,
meta_data_block
->
next_block
,
final_remain
,
1
);
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
);
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
);
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
,
1
);
meta_data_block
->
prev_block
->
block_size
=
size
;
meta_data_block
=
meta_data_block
->
prev_block
;
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
)));
}
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
);
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
;
...
...
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