From 4a7b48203e5597f3830ecb8e68a26b157ba97e5b Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Sun, 4 Dec 2011 18:43:20 +0100 Subject: [PATCH] Try smaller sizes if creating an area failed. Depending on the use case the grow size may be too large to fit into address space holes. Instead of failing try with smaller sizes until it either worked or doesn't make sense anymore (< 1MB). --- src/system/kernel/guarded_heap.cpp | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/system/kernel/guarded_heap.cpp b/src/system/kernel/guarded_heap.cpp index d8d531bb34..b9527f74be 100644 --- a/src/system/kernel/guarded_heap.cpp +++ b/src/system/kernel/guarded_heap.cpp @@ -364,15 +364,25 @@ guarded_heap_area_init(guarded_heap& heap, area_id id, void* baseAddress, static bool guarded_heap_area_create(guarded_heap& heap, uint32 flags) { - void* baseAddress = NULL; - area_id id = create_area("guarded_heap_area", &baseAddress, - B_ANY_KERNEL_ADDRESS, HEAP_GROW_SIZE, B_FULL_LOCK, - B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA); + for (size_t trySize = HEAP_GROW_SIZE; trySize >= 1 * 1024 * 1024; + trySize /= 2) { - if (id < 0) - return false; + void* baseAddress = NULL; + area_id id = create_area("guarded_heap_area", &baseAddress, + B_ANY_KERNEL_ADDRESS, trySize, B_FULL_LOCK, + B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA); - return guarded_heap_area_init(heap, id, baseAddress, HEAP_GROW_SIZE, flags); + if (id < 0) + continue; + + if (guarded_heap_area_init(heap, id, baseAddress, trySize, flags)) + return true; + + delete_area(id); + } + + panic("failed to allocate a new heap area"); + return false; }