diff options
author | Freya Murphy <freya@freyacat.org> | 2025-04-30 10:50:16 -0400 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2025-04-30 11:25:24 -0400 |
commit | 419e2c1a3b92957c279feef9bbb4c8f4949b7fca (patch) | |
tree | 91c672bf5d31b942c114dd8553d0e582d7f12fd8 /user/lib/alloc.c | |
parent | update makefiles (diff) | |
download | comus-419e2c1a3b92957c279feef9bbb4c8f4949b7fca.tar.gz comus-419e2c1a3b92957c279feef9bbb4c8f4949b7fca.tar.bz2 comus-419e2c1a3b92957c279feef9bbb4c8f4949b7fca.zip |
make malloc work
Diffstat (limited to '')
-rw-r--r-- | user/lib/alloc.c | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/user/lib/alloc.c b/user/lib/alloc.c index 3d987d4..9151755 100644 --- a/user/lib/alloc.c +++ b/user/lib/alloc.c @@ -23,15 +23,27 @@ static struct page_header *end_header = NULL; static void *alloc_pages(size_t pages) { - (void)pages; - // TODO: impl - return NULL; + void *brk; + + brk = sbrk(0); + if (brk == NULL) + return NULL; + + if (sbrk(pages * PAGE_SIZE) == NULL) + return NULL; + + return brk; } -static void free_pages(struct page_header *header) +static int free_pages(struct page_header *header) { - (void)header; - // TODO: impl + if (header->next) + return 1; + if (header->used) + return 1; + + sbrk(-(header->free + sizeof(struct page_header))); + return 0; } static struct page_header *get_header(void *ptr) @@ -217,10 +229,11 @@ void free(void *ptr) (header->prev == NULL || header->prev->node_number != header->node_number) && header->used == 0) { - if (header->next) - header->next->prev = header->prev; - if (header->prev) - header->prev->next = header->next; - free_pages(header); + if (free_pages(header) == 0) { + if (header->next) + header->next->prev = header->prev; + if (header->prev) + header->prev->next = header->next; + } } } |