From 369eef1343ed20bf2882d8b05d7690539b02e13a Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sun, 7 Sep 2003 11:55:25 +0000 Subject: [PATCH] Check in per Jeremy Rand: Adjusted implementation to behave like that in R5 -- no more tracking of excess blocks. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@4523 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/support/BlockCache.h | 5 +++-- src/kits/support/BlockCache.cpp | 21 ++++++--------------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/headers/os/support/BlockCache.h b/headers/os/support/BlockCache.h index 58658e38d6..7f8c5c331a 100644 --- a/headers/os/support/BlockCache.h +++ b/headers/os/support/BlockCache.h @@ -67,11 +67,12 @@ private: _FreeBlock *fFreeList; size_t fBlockSize; - int32 fExcessBlocks; + int32 fFreeBlocks; + int32 fBlockCount; BLocker fLocker; void * (*fAlloc)(size_t size); void (*fFree)(void *pointer); - uint32 _reserved[3]; + uint32 _reserved[2]; }; #endif /* _BLOCK_CACHE_H */ diff --git a/src/kits/support/BlockCache.cpp b/src/kits/support/BlockCache.cpp index a69bbfc9fd..d369b715aa 100644 --- a/src/kits/support/BlockCache.cpp +++ b/src/kits/support/BlockCache.cpp @@ -33,16 +33,15 @@ // as well as Get() function, allowing the caller to dispose of the // memory, do not allow to allocate one large block to be used as pool. // Thus we need to create multiple small ones. -// We maintain a list of free blocks. If more blocks with a size of blockSize -// are allocated than available, the variable fExcessBlocks is used to avoid -// growing the pool of free buffers +// We maintain a list of free blocks. BBlockCache::BBlockCache(uint32 blockCount, size_t blockSize, uint32 allocationType) : fFreeList(0), fBlockSize(blockSize), - fExcessBlocks(0), + fFreeBlocks(blockCount), + fBlockCount(blockCount), fLocker("some BBlockCache lock"), fAlloc(0), fFree(0) @@ -107,13 +106,9 @@ BBlockCache::Get(size_t blockSize) ASSERT(fFreeList->magic2 == MAGIC2 + (uint32)fFreeList->next); pointer = fFreeList; fFreeList = fFreeList->next; + fFreeBlocks--; DEBUG_ONLY(memset(pointer, 0xCC, sizeof(_FreeBlock))); } else { - // we need to allocate a new block - if (blockSize == fBlockSize) { - // we now have one more block than wanted - fExcessBlocks++; - } if (blockSize < sizeof(_FreeBlock)) blockSize = sizeof(_FreeBlock); pointer = fAlloc(blockSize); @@ -128,19 +123,15 @@ BBlockCache::Save(void *pointer, size_t blockSize) { if (!fLocker.Lock()) return; - if (blockSize == fBlockSize && fExcessBlocks <= 0) { + if (blockSize == fBlockSize && fFreeBlocks < fBlockCount) { // the block needs to be returned to the cache _FreeBlock *block = reinterpret_cast<_FreeBlock *>(pointer); block->next = fFreeList; fFreeList = block; + fFreeBlocks++; DEBUG_ONLY(block->magic1 = MAGIC1); DEBUG_ONLY(block->magic2 = MAGIC2 + (uint32)block->next); } else { - // the block needs to be deallocated - if (blockSize == fBlockSize) { - fExcessBlocks--; - ASSERT(fExcessBlocks >= 0); - } DEBUG_ONLY(memset(pointer, 0xCC, sizeof(_FreeBlock))); fFree(pointer); }