* 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
This commit is contained in:
Axel Dörfler
2009-11-05 11:14:12 +00:00
parent a5758caa7e
commit a10ac91f6d
+24 -9
View File
@@ -988,6 +988,12 @@ block_cache::Free(void* buffer)
void* void*
block_cache::Allocate() 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); return object_cache_alloc(buffer_cache, 0);
} }
@@ -1014,18 +1020,27 @@ block_cache::FreeBlock(cached_block* block)
cached_block* cached_block*
block_cache::NewBlock(off_t blockNumber) block_cache::NewBlock(off_t blockNumber)
{ {
cached_block* block = (cached_block*)object_cache_alloc(sBlockCache, 0); cached_block* block = NULL;
if (block == 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 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(); block = _GetUnusedBlock();
}
if (block == NULL) {
block = (cached_block*)object_cache_alloc(sBlockCache, 0);
if (block == NULL) { if (block == NULL) {
TB(Error(this, blockNumber, "get unused failed")); TB(Error(this, blockNumber, "allocation failed"));
FATAL(("could not allocate block!\n")); dprintf("block allocation failed, unused list is %sempty.\n",
return NULL; 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;
}
} }
} }