aboutsummaryrefslogtreecommitdiffstats
path: root/src/free_list.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/free_list.c')
-rw-r--r--src/free_list.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/free_list.c b/src/free_list.c
index 11fb59b..6c0ff35 100644
--- a/src/free_list.c
+++ b/src/free_list.c
@@ -22,7 +22,22 @@ free_nd *fl_find_first_fit(free_nd *free_list, size_t size) {
}
void *fl_split_node(free_nd **free_list, free_nd *split_nd, size_t size) {
- /* for now, we'll just remove the node from the free list */
+
+ ssize_t extra_space = split_nd->size - size - sizeof(header);
+ if (extra_space >= SPLIT_THRESHOLD) {
+ free_nd *new_nd = (free_nd*)((char*) (split_nd) + size + sizeof(header));
+ new_nd->next = split_nd ->next;
+ split_nd->next = new_nd;
+
+ new_nd->size = extra_space - sizeof(header);
+
+ header *new_hdr = (header *)((char *)new_nd - sizeof(header));
+ new_hdr->magic_number = MAGIC_NUMBER;
+ new_hdr->size = extra_space - sizeof(header);
+
+ header *old_hdr = (header *)((char *)split_nd- sizeof(header));
+ old_hdr->size = size;
+ }
if (*free_list == split_nd) {
*free_list = (*free_list)->next;