diff options
-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 |