From a10ac91f6d88800d3ce5abaeec1e40aa73c9c792 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 5 Nov 2009 11:14:12 +0000 Subject: [PATCH] * NewBlock(), and Allocate() will now try to reuse existing memory in low resource situations. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33892 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/cache/block_cache.cpp | 33 ++++++++++++++++++------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/src/system/kernel/cache/block_cache.cpp b/src/system/kernel/cache/block_cache.cpp index 6aae2ed7a4..d7ff992c9f 100644 --- a/src/system/kernel/cache/block_cache.cpp +++ b/src/system/kernel/cache/block_cache.cpp @@ -988,6 +988,12 @@ block_cache::Free(void* buffer) void* block_cache::Allocate() { + if (low_resource_state(B_KERNEL_RESOURCE_PAGES | B_KERNEL_RESOURCE_MEMORY) + != B_NO_LOW_RESOURCE) { + // recycle existing before allocating a new one + RemoveUnusedBlocks(1, 2); + } + return object_cache_alloc(buffer_cache, 0); } @@ -1014,18 +1020,27 @@ block_cache::FreeBlock(cached_block* block) cached_block* block_cache::NewBlock(off_t blockNumber) { - cached_block* block = (cached_block*)object_cache_alloc(sBlockCache, 0); - if (block == NULL) { - TB(Error(this, blockNumber, "allocation failed")); - dprintf("block allocation failed, unused list is %sempty.\n", - unused_blocks.IsEmpty() ? "" : "not "); + cached_block* block = NULL; - // allocation failed, try to reuse an unused block + if (low_resource_state(B_KERNEL_RESOURCE_PAGES | B_KERNEL_RESOURCE_MEMORY) + != B_NO_LOW_RESOURCE) { + // recycle existing instead of allocating a new one block = _GetUnusedBlock(); + } + if (block == NULL) { + block = (cached_block*)object_cache_alloc(sBlockCache, 0); if (block == NULL) { - TB(Error(this, blockNumber, "get unused failed")); - FATAL(("could not allocate block!\n")); - return NULL; + TB(Error(this, blockNumber, "allocation failed")); + dprintf("block allocation failed, unused list is %sempty.\n", + unused_blocks.IsEmpty() ? "" : "not "); + + // allocation failed, try to reuse an unused block + block = _GetUnusedBlock(); + if (block == NULL) { + TB(Error(this, blockNumber, "get unused failed")); + FATAL(("could not allocate block!\n")); + return NULL; + } } }