summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-07-08 19:39:48 +0200
committerAnton Kling <anton@kling.gg>2024-07-08 19:39:48 +0200
commit3289c4434c608e85b8e03f097f6639f4fba96bd1 (patch)
tree678a0cbe68cce4b9906b99a651fe3edb1430654c /kernel
parentabcba25c5f5579e50ab205d8fc01ca9dbaa0f5e8 (diff)
kmalloc: Merge headers more often
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kmalloc.c18
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