1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-09 03:52:19 +02:00

Heap fixes

This commit is contained in:
Brian Fiete 2021-11-05 10:48:45 -07:00
parent 3322211048
commit 7e36f374e1

View file

@ -150,7 +150,7 @@ void ContiguousHeap::Clear(int maxAllocSize)
auto block = CH_REL_TO_ABS(blockList->mHead); auto block = CH_REL_TO_ABS(blockList->mHead);
while (block != NULL) while (block != NULL)
{ {
block->mKind = ChBlockKind_Bad; block->mKind = (ChBlockKind)0;
if (block->mNext == -1) if (block->mNext == -1)
break; break;
block = CH_REL_TO_ABS(block->mNext); block = CH_REL_TO_ABS(block->mNext);
@ -160,15 +160,19 @@ void ContiguousHeap::Clear(int maxAllocSize)
blockList->mTail = -1; blockList->mTail = -1;
} }
//static int gAllocCount = 0;
ContiguousHeap::AllocRef ContiguousHeap::Alloc(int size) ContiguousHeap::AllocRef ContiguousHeap::Alloc(int size)
{ {
if (size == 0) if (size == 0)
return 0; return 0;
//int allocCount = ++gAllocCount;
size = BF_ALIGN(size, 16); size = BF_ALIGN(size, 16);
auto blockList = (ChList*)mMetadata; auto blockList = (ChList*)mMetadata;
if (mFreeIdx >= mFreeList.mSize) if (mFreeIdx >= mFreeList.mSize)
mFreeIdx = 0; mFreeIdx = 0;
while (true) while (true)
@ -179,6 +183,8 @@ ContiguousHeap::AllocRef ContiguousHeap::Alloc(int size)
if (block->mKind == ChBlockKind_Merged) if (block->mKind == ChBlockKind_Merged)
{ {
//OutputDebugStrF("ContiguousHeap::Alloc %d removing merged %d\n", allocCount, (uint8*)block - (uint8*)mMetadata);
itr--; itr--;
block->mKind = (ChBlockKind)0; block->mKind = (ChBlockKind)0;
mFreeList.RemoveAtFast(mFreeIdx); mFreeList.RemoveAtFast(mFreeIdx);
@ -194,14 +200,26 @@ ContiguousHeap::AllocRef ContiguousHeap::Alloc(int size)
mFreeList.RemoveAtFast(mFreeIdx); mFreeList.RemoveAtFast(mFreeIdx);
if (block->mSize >= size + 64) if (block->mSize >= size + 64)
{ {
int oldSize = block->mSize;
// Split block // Split block
auto newBlock = new ((uint8*)block + size) ChBlock(); auto newBlock = (ChBlock*)((uint8*)block + size);
if (newBlock->mKind == 0)
{
mFreeList.Add(CH_ABS_TO_REL(newBlock));
}
else
{
BF_ASSERT(newBlock->mKind == ChBlockKind_Merged);
}
newBlock->mPrev = -1;
newBlock->mNext = -1;
newBlock->mSize = block->mSize - size; newBlock->mSize = block->mSize - size;
newBlock->mKind = ChBlockKind_Unused; newBlock->mKind = ChBlockKind_Unused;
blockList->AddAfter(CH_ABS_TO_REL(block), CH_ABS_TO_REL(newBlock)); blockList->AddAfter(CH_ABS_TO_REL(block), CH_ABS_TO_REL(newBlock));
block->mSize = size; block->mSize = size;
mFreeList.Add(CH_ABS_TO_REL(newBlock)); //OutputDebugStrF("ContiguousHeap::Alloc %d alloc %d size: %d remainder in %d size: %d\n", allocCount, CH_ABS_TO_REL(block), size, CH_ABS_TO_REL(newBlock), newBlock->mSize);
} }
block->mKind = ChBlockKind_Used; block->mKind = ChBlockKind_Used;
@ -212,28 +230,33 @@ ContiguousHeap::AllocRef ContiguousHeap::Alloc(int size)
} }
int wantSize = BF_MAX(mMemorySize + mMemorySize / 2, mMemorySize + BF_MAX(size, 64 * 1024)); int wantSize = BF_MAX(mMemorySize + mMemorySize / 2, mMemorySize + BF_MAX(size, 64 * 1024));
wantSize = BF_ALIGN(wantSize, 16);
mMetadata = realloc(mMetadata, wantSize); mMetadata = realloc(mMetadata, wantSize);
int prevSize = mMemorySize;
memset((uint8*)mMetadata + mMemorySize, 0, wantSize - mMemorySize); memset((uint8*)mMetadata + prevSize, 0, wantSize - prevSize);
blockList = (ChList*)mMetadata; blockList = (ChList*)mMetadata;
mMemorySize = wantSize; mMemorySize = wantSize;
ChBlock* block;
if (mBlockDataOfs == 0) if (mBlockDataOfs == 0)
{ {
blockList = new (mMetadata) ChList(); blockList = new (mMetadata) ChList();
mBlockDataOfs = sizeof(ChList); mBlockDataOfs = BF_ALIGN(sizeof(ChList), 16);
prevSize = mBlockDataOfs;
} }
blockList->mMetadata = mMetadata; blockList->mMetadata = mMetadata;
block = new ((uint8*)mMetadata + prevSize) ChBlock();
auto block = new ((uint8*)mMetadata + mBlockDataOfs) ChBlock(); block->mSize = wantSize - prevSize;
block->mSize = mMemorySize - mBlockDataOfs; block->mKind = ChBlockKind_Unused;
block->mKind = ChBlockKind_Unused;
mBlockDataOfs += block->mSize;
blockList->PushBack(CH_ABS_TO_REL(block)); blockList->PushBack(CH_ABS_TO_REL(block));
mFreeList.Add(CH_ABS_TO_REL(block)); mFreeList.Add(CH_ABS_TO_REL(block));
//OutputDebugStrF("ContiguousHeap::Alloc %d alloc %d size: %d\n", allocCount, (uint8*)block - (uint8*)mMetadata, block->mSize);
if (mFreeIdx >= mFreeList.mSize) if (mFreeIdx >= mFreeList.mSize)
mFreeIdx = 0; mFreeIdx = 0;
} }
@ -289,6 +312,9 @@ bool ContiguousHeap::Free(AllocRef ref)
mFreeList.Add(CH_ABS_TO_REL(mergeHead)); mFreeList.Add(CH_ABS_TO_REL(mergeHead));
} }
mergeHead->mKind = ChBlockKind_Unused; mergeHead->mKind = ChBlockKind_Unused;
//OutputDebugStrF("ContiguousHeap::Free %d size: %d\n", CH_ABS_TO_REL(mergeHead), mergeHead->mSize);
return true; return true;
} }