aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas B. Rumbaugh <doug@douglasrumbaugh.com>2025-11-02 15:41:16 -0500
committerDouglas B. Rumbaugh <doug@douglasrumbaugh.com>2025-11-02 15:41:16 -0500
commitcadb32d38b840b16804c8d3370408c7db7a32a2d (patch)
tree3717c4c1c04afb7f18e5fc7306626252e548c295
parent04b57a756402e156953edfa2079d69b41db26e51 (diff)
downloadliballoc-cadb32d38b840b16804c8d3370408c7db7a32a2d.tar.gz
Initial implementation of free list functions
Implemented (but haven't tested) adding nodes to the free list and coalescing them.
-rw-r--r--src/free_list.c47
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;
+}