hrev43403 adds 1 changeset to branch 'master' old head: 01eb710a9153406a2ce2be08c00a01d56f7737e3 new head: 4a7b48203e5597f3830ecb8e68a26b157ba97e5b ---------------------------------------------------------------------------- 4a7b482: 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). [ Michael Lotz <mmlr@xxxxxxxx> ] ---------------------------------------------------------------------------- Revision: hrev43403 Commit: 4a7b48203e5597f3830ecb8e68a26b157ba97e5b URL: http://cgit.haiku-os.org/haiku/commit/?id=4a7b482 Author: Michael Lotz <mmlr@xxxxxxxx> Date: Sun Dec 4 17:43:20 2011 UTC ---------------------------------------------------------------------------- 1 files changed, 17 insertions(+), 7 deletions(-) src/system/kernel/guarded_heap.cpp | 24 +++++++++++++++++------- ---------------------------------------------------------------------------- diff --git a/src/system/kernel/guarded_heap.cpp b/src/system/kernel/guarded_heap.cpp index d8d531b..b9527f7 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); + + if (id < 0) + continue; + + if (guarded_heap_area_init(heap, id, baseAddress, trySize, flags)) + return true; - return guarded_heap_area_init(heap, id, baseAddress, HEAP_GROW_SIZE, flags); + delete_area(id); + } + + panic("failed to allocate a new heap area"); + return false; }