diff options
| author | Jcw87 <Jcw87@users.noreply.github.com> | 2023-09-22 16:32:19 -0700 |
|---|---|---|
| committer | Jcw87 <Jcw87@users.noreply.github.com> | 2023-09-24 01:45:11 -0700 |
| commit | cdbe2b5174f0997fb0a5522e7ef7d9bf347f30d1 (patch) | |
| tree | ccf520b438a4ba295d4fc9002feed5841abc97e6 /src | |
| parent | b70bc6dd30a040c648321ac1aad2a7c2a0d9b001 (diff) | |
JKRAramHeap
Diffstat (limited to 'src')
| -rw-r--r-- | src/JSystem/JKernel/JKRAramHeap.cpp | 141 |
1 files changed, 122 insertions, 19 deletions
diff --git a/src/JSystem/JKernel/JKRAramHeap.cpp b/src/JSystem/JKernel/JKRAramHeap.cpp index 78b974ef..ab248834 100644 --- a/src/JSystem/JKernel/JKRAramHeap.cpp +++ b/src/JSystem/JKernel/JKRAramHeap.cpp @@ -4,49 +4,152 @@ // #include "JSystem/JKernel/JKRAramHeap.h" -#include "dolphin/types.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "dolphin/os/OS.h" +#include "global.h" + +JSUList<JKRAramBlock> JKRAramHeap::sAramList; /* 802B53E8-802B54B8 .text __ct__11JKRAramHeapFUlUl */ -JKRAramHeap::JKRAramHeap(unsigned long, unsigned long) { - /* Nonmatching */ +JKRAramHeap::JKRAramHeap(u32 startAddress, u32 size) { + OSInitMutex(&mMutex); + + mHeap = JKRHeap::findFromRoot(this); + mSize = ALIGN_PREV(size, 0x20); + mHeadAddress = ALIGN_NEXT(startAddress, 0x20); + mTailAddress = mHeadAddress + mSize; + mGroupId = -1; + + JKRAramBlock* block = new (mHeap, 0) JKRAramBlock(mHeadAddress, 0, mSize, -1, false); + sAramList.append(&block->mBlockLink); } /* 802B54B8-802B5560 .text __dt__11JKRAramHeapFv */ JKRAramHeap::~JKRAramHeap() { - /* Nonmatching */ + JSUListIterator<JKRAramBlock> iterator(sAramList.getFirst()); + while (iterator != sAramList.getEnd()) { + delete (iterator++).getObject(); + } } /* 802B5560-802B55D8 .text alloc__11JKRAramHeapFUlQ211JKRAramHeap10EAllocMode */ -void JKRAramHeap::alloc(unsigned long, JKRAramHeap::EAllocMode) { - /* Nonmatching */ +JKRAramBlock* JKRAramHeap::alloc(u32 size, JKRAramHeap::EAllocMode allocationMode) { + lock(); + + JKRAramBlock* block; + if (allocationMode == JKRAramHeap::HEAD) { + block = allocFromHead(size); + } else { + block = allocFromTail(size); + } + + unlock(); + return block; } /* 802B55D8-802B5660 .text allocFromHead__11JKRAramHeapFUl */ -void JKRAramHeap::allocFromHead(unsigned long) { - /* Nonmatching */ +JKRAramBlock* JKRAramHeap::allocFromHead(u32 size) { + u32 alignedSize = ALIGN_NEXT(size, 0x20); + u32 bestFreeSize = UINT32_MAX; + JKRAramBlock* bestBlock = NULL; + + JSUList<JKRAramBlock>* list = &sAramList; + for (JSUListIterator<JKRAramBlock> iterator = list; iterator != list->getEnd(); ++iterator) { + JKRAramBlock* block = iterator.getObject(); + if (block->mFreeSize < alignedSize) + continue; + if (bestFreeSize <= block->mFreeSize) + continue; + + bestFreeSize = block->mFreeSize; + bestBlock = block; + + if (block->mFreeSize == alignedSize) { + break; + } + } + + if (bestBlock) { + return bestBlock->allocHead(alignedSize, mGroupId, this); + } + + return NULL; } /* 802B5660-802B56D8 .text allocFromTail__11JKRAramHeapFUl */ -void JKRAramHeap::allocFromTail(unsigned long) { - /* Nonmatching */ +JKRAramBlock* JKRAramHeap::allocFromTail(u32 size) { + u32 alignedSize = ALIGN_NEXT(size, 0x20); + JKRAramBlock* tailBlock = NULL; + + JSUList<JKRAramBlock>* list = &sAramList; + JSUListIterator<JKRAramBlock> iterator = list->getLast(); + for (; iterator != list->getEnd(); --iterator) { + JKRAramBlock* block = iterator.getObject(); + if (block->mFreeSize >= alignedSize) { + tailBlock = block; + break; + } + } + + if (tailBlock) { + return tailBlock->allocTail(alignedSize, mGroupId, this); + } + + return NULL; } /* 802B56D8-802B5750 .text getFreeSize__11JKRAramHeapFv */ -void JKRAramHeap::getFreeSize() { - /* Nonmatching */ +u32 JKRAramHeap::getFreeSize() { + u32 maxFreeSize = 0; + + lock(); + + JSUList<JKRAramBlock>* list = &sAramList; + JSUListIterator<JKRAramBlock> iterator = list; + for (; iterator != list->getEnd(); ++iterator) { + if (iterator->mFreeSize > maxFreeSize) { + maxFreeSize = iterator->mFreeSize; + } + } + + unlock(); + return maxFreeSize; } /* 802B5750-802B57BC .text getTotalFreeSize__11JKRAramHeapFv */ -void JKRAramHeap::getTotalFreeSize() { - /* Nonmatching */ +u32 JKRAramHeap::getTotalFreeSize() { + u32 totalFreeSize = 0; + + lock(); + + JSUList<JKRAramBlock>* list = &sAramList; + JSUListIterator<JKRAramBlock> iterator = list; + for (; iterator != list->getEnd(); ++iterator) { + totalFreeSize += iterator->mFreeSize; + } + + unlock(); + return totalFreeSize; } /* 802B57BC-802B590C .text dump__11JKRAramHeapFv */ void JKRAramHeap::dump() { - /* Nonmatching */ -} + lock(); + + OSReport("\nJKRAramHeap dump\n"); + OSReport(" attr address: size gid\n"); + u32 bytesUsed = 0; + for (JSUListIterator<JKRAramBlock> iterator = sAramList.getFirst() ; iterator != sAramList.getEnd(); ++iterator) { + if (iterator->mSize) { + const char* type; + OSReport("%s %08x: %08x %3d\n", iterator->isTempMemory() ? " temp" : "alloc", iterator->mAddress, iterator->mSize, iterator->mGroupId); + } + if (iterator->mFreeSize) { + OSReport(" free %08x: %08x 0\n", iterator->mAddress + iterator->mSize, iterator->mFreeSize); + } + bytesUsed += iterator->mSize; + } + OSReport("%d / %d bytes (%6.2f%%) used\n", bytesUsed, mSize, (f32)bytesUsed / (f32)mSize * 100.0f); -/* 802B5950-802B59A4 .text __dt__23JSUList<12JKRAramBlock>Fv */ -JSUList<JKRAramBlock>::~JSUList() { - /* Nonmatching */ + unlock(); } |
