mirror of https://github.com/zeldaret/tp.git
156 lines
3.8 KiB
C++
156 lines
3.8 KiB
C++
#include "JSystem/JKernel/JKRAramHeap/JKRAramHeap.h"
|
|
#include "global.h"
|
|
|
|
#include "JSystem/JKernel/JKRAramBlock/JKRAramBlock.h"
|
|
|
|
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);
|
|
lbl_8043430C.append(&block->mBlockLink);
|
|
}
|
|
|
|
// close match, regalloc problem in the beginning of the while loop
|
|
#if NONMATCHING
|
|
JKRAramHeap::~JKRAramHeap() {
|
|
JSUList<JKRAramBlock>* list = &lbl_8043430C;
|
|
JSUListIterator<JKRAramBlock> iterator = list;
|
|
|
|
while (iterator != list->getEnd()) {
|
|
JSUListIterator<JKRAramBlock> prev = iterator;
|
|
JKRAramBlock* block = prev.getObject();
|
|
delete block;
|
|
}
|
|
}
|
|
#else
|
|
asm JKRAramHeap::~JKRAramHeap() {
|
|
nofralloc
|
|
#include "JSystem/JKernel/JKRAramHeap/asm/func_802D2F14.s"
|
|
}
|
|
#endif
|
|
|
|
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;
|
|
}
|
|
|
|
JKRAramBlock* JKRAramHeap::allocFromHead(u32 size) {
|
|
u32 alignedSize = ALIGN_NEXT(size, 0x20);
|
|
u32 bestFreeSize = UINT32_MAX;
|
|
JKRAramBlock* bestBlock = NULL;
|
|
|
|
JSUList<JKRAramBlock>* list = &lbl_8043430C;
|
|
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;
|
|
}
|
|
|
|
JKRAramBlock* JKRAramHeap::allocFromTail(u32 size) {
|
|
u32 alignedSize = ALIGN_NEXT(size, 0x20);
|
|
JKRAramBlock* tailBlock = NULL;
|
|
|
|
JSUList<JKRAramBlock>* list = &lbl_8043430C;
|
|
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;
|
|
}
|
|
|
|
u32 JKRAramHeap::getFreeSize(void) {
|
|
u32 maxFreeSize = 0;
|
|
|
|
lock();
|
|
|
|
JSUList<JKRAramBlock>* list = &lbl_8043430C;
|
|
JSUListIterator<JKRAramBlock> iterator = list;
|
|
for (; iterator != list->getEnd(); ++iterator) {
|
|
if (iterator->mFreeSize > maxFreeSize) {
|
|
maxFreeSize = iterator->mFreeSize;
|
|
}
|
|
}
|
|
|
|
unlock();
|
|
return maxFreeSize;
|
|
}
|
|
|
|
u32 JKRAramHeap::getTotalFreeSize(void) {
|
|
u32 totalFreeSize = 0;
|
|
|
|
lock();
|
|
|
|
JSUList<JKRAramBlock>* list = &lbl_8043430C;
|
|
JSUListIterator<JKRAramBlock> iterator = list;
|
|
for (; iterator != list->getEnd(); ++iterator) {
|
|
totalFreeSize += iterator->mFreeSize;
|
|
}
|
|
|
|
unlock();
|
|
return totalFreeSize;
|
|
}
|
|
|
|
void JKRAramHeap::dump(void) {
|
|
lock();
|
|
|
|
JSUList<JKRAramBlock>* list = &lbl_8043430C;
|
|
JSUListIterator<JKRAramBlock> iterator = list;
|
|
for (; iterator != list->getEnd(); ++iterator) {
|
|
// The debug version calls OSReport
|
|
}
|
|
|
|
unlock();
|
|
}
|
|
|
|
#if 0
|
|
asm void __sinit_JKRAramHeap_cpp {
|
|
nofralloc
|
|
#include "JSystem/JKernel/JKRAramHeap/asm/func_802D326C.s"
|
|
}
|
|
|
|
asm JSUList<12JKRAramBlock>::~JSUList<12JKRAramBlock>(void) {
|
|
nofralloc
|
|
#include "JSystem/JKernel/JKRAramHeap/asm/func_802D32B0.s"
|
|
}
|
|
#endif
|