[haiku-commits] haiku: hrev43403 - src/system/kernel

  • From: mmlr@xxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 4 Dec 2011 18:47:06 +0100 (CET)

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;
 }
 
 


Other related posts:

  • » [haiku-commits] haiku: hrev43403 - src/system/kernel - mmlr