diff options
author | Anton Kling <anton@kling.gg> | 2024-07-08 19:39:48 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-07-08 19:39:48 +0200 |
commit | 3289c4434c608e85b8e03f097f6639f4fba96bd1 (patch) | |
tree | 678a0cbe68cce4b9906b99a651fe3edb1430654c | |
parent | abcba25c5f5579e50ab205d8fc01ca9dbaa0f5e8 (diff) |
kmalloc: Merge headers more often
-rw-r--r-- | kernel/kmalloc.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/kernel/kmalloc.c b/kernel/kmalloc.c index 86c4eda..b4a7f54 100644 --- a/kernel/kmalloc.c +++ b/kernel/kmalloc.c @@ -134,7 +134,9 @@ static MallocHeader *next_close_header(MallocHeader *a) { return next_header(a); } -MallocHeader *find_free_entry(u32 s) { +int merge_headers(MallocHeader *b); + +static MallocHeader *find_free_entry(u32 s) { // A new header is required as well as the newly allocated chunk s += sizeof(MallocHeader); if (!head) { @@ -150,6 +152,11 @@ MallocHeader *find_free_entry(u32 s) { } u64 required_size = s; if (p->size < required_size) { + for (; merge_headers(p);) + ; + if (p->size >= required_size) { + return p; + } continue; } return p; @@ -157,18 +164,18 @@ MallocHeader *find_free_entry(u32 s) { return NULL; } -void merge_headers(MallocHeader *b) { +int merge_headers(MallocHeader *b) { if (!(b->flags & IS_FREE)) { - return; + return 0; } MallocHeader *n = next_close_header(b); if (!n) { - return; + return 0; } if (!(n->flags & IS_FREE)) { - return; + return 0; } b->size += n->size; @@ -177,6 +184,7 @@ void merge_headers(MallocHeader *b) { if (n == final) { final = b; } + return 1; } #ifdef KMALLOC_DEBUG |