mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-09-03 00:53:47 -04:00
JKRAramHeap and JKRAramPiece (#53)
* renamed func_XXX to _savegpr_XX * renamed func_XXX to _restgpr_XX * renamed func_XXX to _savefpr_XX * renamed func_XXX to _restfpr_XX * cleanup functions.h and moved intrisics to mwcc.h * formatting * cleanup functions.h * Added include/ar/ARQ.h * renamed func_XXX to _savegpr_25 * removed JKRAramPiece asm files * JKRAramHeap OK, JKRAramPiece OK * formatting * more formatting * Added const and removed explicit this-> * fixed merge problems * changed mMessages[1] to mMessage * foramatting Co-authored-by: Julgodis <> Co-authored-by: Pheenoh <pheenoh@gmail.com>
This commit is contained in:
@@ -1,44 +1,145 @@
|
||||
#include "JSystem/JKernel/JKRAramHeap/JKRAramHeap.h"
|
||||
#include "global.h"
|
||||
|
||||
asm JKRAramHeap::JKRAramHeap(u32, u32) {
|
||||
nofralloc
|
||||
#include "JSystem/JKernel/JKRAramHeap/asm/func_802D2E44.s"
|
||||
#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);
|
||||
}
|
||||
|
||||
asm JKRAramHeap::~JKRAramHeap(void) {
|
||||
// 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
|
||||
|
||||
asm void JKRAramHeap::alloc(u32, JKRAramHeap::EAllocMode) {
|
||||
nofralloc
|
||||
#include "JSystem/JKernel/JKRAramHeap/asm/func_802D2FBC.s"
|
||||
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;
|
||||
}
|
||||
|
||||
asm void JKRAramHeap::allocFromHead(u32) {
|
||||
nofralloc
|
||||
#include "JSystem/JKernel/JKRAramHeap/asm/func_802D3034.s"
|
||||
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;
|
||||
}
|
||||
|
||||
asm void JKRAramHeap::allocFromTail(u32) {
|
||||
nofralloc
|
||||
#include "JSystem/JKernel/JKRAramHeap/asm/func_802D30BC.s"
|
||||
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;
|
||||
}
|
||||
|
||||
asm void JKRAramHeap::getFreeSize(void) {
|
||||
nofralloc
|
||||
#include "JSystem/JKernel/JKRAramHeap/asm/func_802D3134.s"
|
||||
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;
|
||||
}
|
||||
|
||||
asm void JKRAramHeap::getTotalFreeSize(void) {
|
||||
nofralloc
|
||||
#include "JSystem/JKernel/JKRAramHeap/asm/func_802D31AC.s"
|
||||
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;
|
||||
}
|
||||
|
||||
asm void JKRAramHeap::dump(void) {
|
||||
nofralloc
|
||||
#include "JSystem/JKernel/JKRAramHeap/asm/func_802D3218.s"
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user