diff options
| author | Douglas B. Rumbaugh <doug@douglasrumbaugh.com> | 2025-11-02 15:41:16 -0500 |
|---|---|---|
| committer | Douglas B. Rumbaugh <doug@douglasrumbaugh.com> | 2025-11-02 15:41:16 -0500 |
| commit | cadb32d38b840b16804c8d3370408c7db7a32a2d (patch) | |
| tree | 3717c4c1c04afb7f18e5fc7306626252e548c295 /src/free_list.c | |
| parent | 04b57a756402e156953edfa2079d69b41db26e51 (diff) | |
| download | liballoc-cadb32d38b840b16804c8d3370408c7db7a32a2d.tar.gz | |
Initial implementation of free list functions
Implemented (but haven't tested) adding nodes
to the free list and coalescing them.
Diffstat (limited to 'src/free_list.c')
| -rw-r--r-- | src/free_list.c | 47 |
1 files changed, 42 insertions, 5 deletions
diff --git a/src/free_list.c b/src/free_list.c index c1dd79c..5ea5f2e 100644 --- a/src/free_list.c +++ b/src/free_list.c @@ -5,18 +5,55 @@ * CISC 301 -- Operating Systems, Project 3 * * Copyright (C) 2025 Douglas B. Rumbaugh <dbrumbaugh@harrisburgu.edu> - * + * * Distributed under the Modified BSD License * */ #include "free_list.h" -free_nd *fl_find_first_fit(free_nd *free_list, size_t size) { return NULL; } +free_nd *fl_find_first_fit(free_nd *free_list, size_t size) { + for (free_nd *nd = free_list; nd; nd = nd->next) { + if (nd->size >= size) { + return nd; + } + } -void *fl_split_node(free_nd *free_list, free_nd *nd, size_t size) { return NULL; } -void fl_coalesce_nodes(free_nd *free_list) {} +void *fl_split_node(free_nd **free_list, free_nd *nd, size_t size) { + return NULL; +} + +void fl_coalesce_nodes(free_nd *free_list) { + for (free_nd *nd = free_list; nd; nd = nd->next) { + if ((size_t)nd + sizeof(header) == (size_t)nd->next) { + nd->size += sizeof(header) + nd->next->size; + nd->next = nd->next->next; + } + } +} -void fl_add_node(free_nd *free_list, void *ptr) {} +void fl_add_node(free_nd **free_list, void *ptr) { + free_nd *new_nd = (free_nd *)ptr; + new_nd->next = NULL; + new_nd->size = ((header *)ptr - sizeof(header))->size; + + if (!(*free_list)) { + *free_list = new_nd; + return; + } + + for (free_nd *nd = *free_list; nd; nd = nd->next) { + if (nd->next > new_nd) { + new_nd->next = nd->next; + nd->next = new_nd; + return; + } + } + + /* if we get here, then the new node must go before the current head */ + new_nd->next = *free_list; + *free_list = new_nd; + return; +} |