* 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:
+24
-9
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user