mirror of
https://github.com/encounter/tp.git
synced 2026-07-11 06:18:46 -07:00
JASHeapCtrl (#1965)
This commit is contained in:
@@ -4,24 +4,19 @@
|
||||
//
|
||||
|
||||
#include "JSystem/JAudio2/JASHeapCtrl.h"
|
||||
#include "JSystem/JAudio2/JASMutex.h"
|
||||
#include "JSystem/JKernel/JKRExpHeap.h"
|
||||
#include "JSystem/JKernel/JKRSolidHeap.h"
|
||||
#include "JSystem/JUtility/JUTAssert.h"
|
||||
#include "dol2asm.h"
|
||||
|
||||
//
|
||||
// Types:
|
||||
//
|
||||
|
||||
struct JKRSolidHeap {};
|
||||
|
||||
struct JKRHeap {
|
||||
static u8 sSystemHeap[4];
|
||||
};
|
||||
|
||||
struct JKRExpHeap {
|
||||
/* 802CEE2C */ void create(u32, JKRHeap*, bool);
|
||||
};
|
||||
|
||||
struct JASDisposer {
|
||||
/* 80290BCC */ void onDispose();
|
||||
virtual ~JASDisposer();
|
||||
/* 80290BCC */ virtual void onDispose();
|
||||
};
|
||||
|
||||
//
|
||||
@@ -86,34 +81,80 @@ extern "C" u8 sSystemHeap__7JKRHeap[4];
|
||||
//
|
||||
|
||||
/* 80290140-802901AC 28AA80 006C+00 1/1 2/2 0/0 .text __ct__7JASHeapFP11JASDisposer */
|
||||
#pragma push
|
||||
#pragma optimization_level 0
|
||||
#pragma optimizewithasm off
|
||||
asm JASHeap::JASHeap(JASDisposer* param_0) : mTree(this) {
|
||||
nofralloc
|
||||
#include "asm/JSystem/JAudio2/JASHeapCtrl/__ct__7JASHeapFP11JASDisposer.s"
|
||||
JASHeap::JASHeap(JASDisposer* disposer) : mTree(this) {
|
||||
mDisposer = disposer;
|
||||
mBase = NULL;
|
||||
mSize = 0;
|
||||
field_0x40 = 0;
|
||||
OSInitMutex(&mMutex);
|
||||
}
|
||||
#pragma pop
|
||||
|
||||
/* 802901AC-8029021C 28AAEC 0070+00 1/1 0/0 0/0 .text initRootHeap__7JASHeapFPvUl */
|
||||
#pragma push
|
||||
#pragma optimization_level 0
|
||||
#pragma optimizewithasm off
|
||||
asm void JASHeap::initRootHeap(void* param_0, u32 param_1) {
|
||||
nofralloc
|
||||
#include "asm/JSystem/JAudio2/JASHeapCtrl/initRootHeap__7JASHeapFPvUl.s"
|
||||
void JASHeap::initRootHeap(void* param_0, u32 param_1) {
|
||||
JUT_ASSERT(97, ! isAllocated());
|
||||
JASMutexLock lock(&mMutex);
|
||||
mBase = (u8*)OSRoundUpPtr(param_0, 0x20);
|
||||
field_0x40 = NULL;
|
||||
mSize = param_1 - (u32(mBase) - u32(param_0));
|
||||
}
|
||||
#pragma pop
|
||||
|
||||
/* 8029021C-802903F4 28AB5C 01D8+00 0/0 2/2 0/0 .text alloc__7JASHeapFP7JASHeapUl */
|
||||
#pragma push
|
||||
#pragma optimization_level 0
|
||||
#pragma optimizewithasm off
|
||||
asm bool JASHeap::alloc(JASHeap* param_0, u32 param_1) {
|
||||
nofralloc
|
||||
#include "asm/JSystem/JAudio2/JASHeapCtrl/alloc__7JASHeapFP7JASHeapUl.s"
|
||||
bool JASHeap::alloc(JASHeap* mother, u32 param_1) {
|
||||
JUT_ASSERT(120, mother != 0);
|
||||
JASMutexLock lock(&mMutex);
|
||||
if (isAllocated()) {
|
||||
#ifdef DEBUG
|
||||
OSReport("[JASHeap::alloc] すでにヒープは確保されています。初期化してからにしてください。\n");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
if (!mother->isAllocated()) {
|
||||
return 0;
|
||||
}
|
||||
param_1 = OSRoundUp32B(param_1);
|
||||
u32 local_28 = mother->getCurOffset();
|
||||
u32 local_2c = mother->getTailOffset();
|
||||
if (local_28 + param_1 <= local_2c) {
|
||||
mother->insertChild(this, mother->getTailHeap(), mother->mBase + local_28, param_1, false);
|
||||
return 1;
|
||||
}
|
||||
s32 r27 = -1;
|
||||
u8* r29 = mother->mBase;
|
||||
bool local_43 = false;
|
||||
JASHeap* local_30 = NULL;
|
||||
void* local_34;
|
||||
for (JSUTreeIterator<JASHeap> it = mother->mTree.getFirstChild(); it != mother->mTree.getEndChild(); it++) {
|
||||
if (r29 >= mother->mBase + local_2c) {
|
||||
break;
|
||||
}
|
||||
u32 local_3c = u32(it->mBase) - u32(r29);
|
||||
if (local_3c >= param_1 && local_3c < r27) {
|
||||
local_30 = *it;
|
||||
local_34 = r29;
|
||||
r27 = local_3c;
|
||||
local_43 = true;
|
||||
}
|
||||
u32 r25 = it->mSize;
|
||||
r29 = (u8*)it->mBase + r25;
|
||||
}
|
||||
if (r29 != mother->mBase && r29 < mother->mBase + local_2c) {
|
||||
u32 local_40 = mother->mBase + mother->mSize - r29;
|
||||
if (local_40 >= param_1 && local_40 < r27) {
|
||||
local_30 = NULL;
|
||||
local_34 = r29;
|
||||
r27 = local_40;
|
||||
local_43 = true;
|
||||
}
|
||||
}
|
||||
if (!local_43) {
|
||||
#ifdef DEBUG
|
||||
OSReport("[JASHeap::alloc] マザーメモリが足りないので確保できません。\n");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
mother->insertChild(this, local_30, local_34, param_1, false);
|
||||
return 1;
|
||||
}
|
||||
#pragma pop
|
||||
|
||||
/* 802903F4-802904E4 28AD34 00F0+00 0/0 1/1 0/0 .text allocTail__7JASHeapFP7JASHeapUl */
|
||||
#pragma push
|
||||
@@ -126,17 +167,77 @@ asm bool JASHeap::allocTail(JASHeap* param_0, u32 param_1) {
|
||||
#pragma pop
|
||||
|
||||
/* 802904E4-80290608 28AE24 0124+00 0/0 4/4 0/0 .text free__7JASHeapFv */
|
||||
// regswap
|
||||
#ifdef NONMATCHING
|
||||
bool JASHeap::free() {
|
||||
JASMutexLock lock(&mMutex);
|
||||
if (!isAllocated()) {
|
||||
return false;
|
||||
}
|
||||
JSUTreeIterator<JASHeap> stack_20;
|
||||
for (JSUTreeIterator<JASHeap> it(mTree.getFirstChild()); it != mTree.getEndChild(); it = stack_20) {
|
||||
stack_20 = it;
|
||||
stack_20++;
|
||||
it->free();
|
||||
}
|
||||
JSUTree<JASHeap>* parentTree = mTree.getParent();
|
||||
if (parentTree) {
|
||||
JASHeap* parentHeap = parentTree->getObject();
|
||||
if (parentHeap->field_0x40 == this) {
|
||||
JSUTreeIterator<JASHeap> stack_28(mTree.getPrevChild());
|
||||
if (stack_28 != mTree.getEndChild()) {
|
||||
parentHeap->field_0x40 = *stack_28;
|
||||
} else {
|
||||
parentHeap->field_0x40 = NULL;
|
||||
}
|
||||
}
|
||||
parentTree->removeChild(&mTree);
|
||||
}
|
||||
mBase = NULL;
|
||||
field_0x40 = NULL;
|
||||
mSize = 0;
|
||||
if (mDisposer) {
|
||||
mDisposer->onDispose();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
#pragma push
|
||||
#pragma optimization_level 0
|
||||
#pragma optimizewithasm off
|
||||
asm void JASHeap::free() {
|
||||
asm bool JASHeap::free() {
|
||||
nofralloc
|
||||
#include "asm/JSystem/JAudio2/JASHeapCtrl/free__7JASHeapFv.s"
|
||||
}
|
||||
#pragma pop
|
||||
#endif
|
||||
|
||||
/* 80290608-802906F0 28AF48 00E8+00 2/2 0/0 0/0 .text
|
||||
* insertChild__7JASHeapFP7JASHeapP7JASHeapPvUlb */
|
||||
// regalloc
|
||||
#ifdef NONMATCHING
|
||||
void JASHeap::insertChild(JASHeap* heap, JASHeap* next, void* param_2, u32 param_3, bool param_4) {
|
||||
JUT_ASSERT(537, heap != 0);
|
||||
JUT_ASSERT(538, next == 0 || &mTree == next->mTree.getParent());
|
||||
JASMutexLock lock(&mMutex);
|
||||
if (!param_4) {
|
||||
JSUTreeIterator<JASHeap> it;
|
||||
if (!next) {
|
||||
it = mTree.getLastChild();
|
||||
} else {
|
||||
it = next->mTree.getPrevChild();
|
||||
}
|
||||
JASHeap* r24 = it != mTree.getEndChild() ? it.getObject() : NULL;
|
||||
if (field_0x40 == r24) {
|
||||
field_0x40 = heap;
|
||||
}
|
||||
}
|
||||
heap->mBase = (u8*)param_2;
|
||||
heap->mSize = param_3;
|
||||
heap->field_0x40 = NULL;
|
||||
mTree.insertChild(&next->mTree, &heap->mTree);
|
||||
}
|
||||
#else
|
||||
#pragma push
|
||||
#pragma optimization_level 0
|
||||
#pragma optimizewithasm off
|
||||
@@ -146,46 +247,45 @@ asm void JASHeap::insertChild(JASHeap* param_0, JASHeap* param_1, void* param_2,
|
||||
#include "asm/JSystem/JAudio2/JASHeapCtrl/insertChild__7JASHeapFP7JASHeapP7JASHeapPvUlb.s"
|
||||
}
|
||||
#pragma pop
|
||||
#endif
|
||||
|
||||
/* 802906F0-8029077C 28B030 008C+00 3/3 0/0 0/0 .text getTailHeap__7JASHeapFv */
|
||||
#pragma push
|
||||
#pragma optimization_level 0
|
||||
#pragma optimizewithasm off
|
||||
asm void JASHeap::getTailHeap() {
|
||||
nofralloc
|
||||
#include "asm/JSystem/JAudio2/JASHeapCtrl/getTailHeap__7JASHeapFv.s"
|
||||
JASHeap* JASHeap::getTailHeap() {
|
||||
JSUTreeIterator<JASHeap> it;
|
||||
JASMutexLock lock(&mMutex);
|
||||
if (!field_0x40) {
|
||||
it = mTree.getFirstChild();
|
||||
} else {
|
||||
it = field_0x40->mTree.getNextChild();
|
||||
}
|
||||
if (it == mTree.getEndChild()) {
|
||||
return NULL;
|
||||
}
|
||||
return it.getObject();
|
||||
}
|
||||
#pragma pop
|
||||
|
||||
/* 8029077C-802907E0 28B0BC 0064+00 2/2 0/0 0/0 .text getTailOffset__7JASHeapFv */
|
||||
#pragma push
|
||||
#pragma optimization_level 0
|
||||
#pragma optimizewithasm off
|
||||
asm void JASHeap::getTailOffset() {
|
||||
nofralloc
|
||||
#include "asm/JSystem/JAudio2/JASHeapCtrl/getTailOffset__7JASHeapFv.s"
|
||||
u32 JASHeap::getTailOffset() {
|
||||
JASMutexLock lock(&mMutex);
|
||||
JASHeap* heap = getTailHeap();
|
||||
u32 offset = !heap ? mSize : heap->mBase - mBase;
|
||||
return offset;
|
||||
}
|
||||
#pragma pop
|
||||
|
||||
/* 802907E0-80290848 28B120 0068+00 2/2 0/0 0/0 .text getCurOffset__7JASHeapFv */
|
||||
#pragma push
|
||||
#pragma optimization_level 0
|
||||
#pragma optimizewithasm off
|
||||
asm void JASHeap::getCurOffset() {
|
||||
nofralloc
|
||||
#include "asm/JSystem/JAudio2/JASHeapCtrl/getCurOffset__7JASHeapFv.s"
|
||||
u32 JASHeap::getCurOffset() {
|
||||
JASMutexLock lock(&mMutex);
|
||||
u32 offset = !field_0x40 ? 0 : field_0x40->mBase + field_0x40->mSize - mBase;
|
||||
return offset;
|
||||
}
|
||||
#pragma pop
|
||||
|
||||
/* 80290848-80290860 28B188 0018+00 0/0 32/32 0/0 .text __ct__17JASGenericMemPoolFv */
|
||||
#pragma push
|
||||
#pragma optimization_level 0
|
||||
#pragma optimizewithasm off
|
||||
asm JASGenericMemPool::JASGenericMemPool() {
|
||||
nofralloc
|
||||
#include "asm/JSystem/JAudio2/JASHeapCtrl/__ct__17JASGenericMemPoolFv.s"
|
||||
JASGenericMemPool::JASGenericMemPool() {
|
||||
field_0x0 = NULL;
|
||||
freeMemCount = 0;
|
||||
totalMemCount = 0;
|
||||
field_0xc = 0;
|
||||
}
|
||||
#pragma pop
|
||||
|
||||
/* 80290860-802908C8 28B1A0 0068+00 0/0 9/9 0/0 .text __dt__17JASGenericMemPoolFv */
|
||||
#pragma push
|
||||
@@ -234,16 +334,27 @@ asm void JASGenericMemPool::free(void* param_0, u32 param_1) {
|
||||
|
||||
/* ############################################################################################## */
|
||||
/* 80451214-80451218 000714 0004+00 1/1 0/0 0/0 .sbss sAramBase__9JASKernel */
|
||||
u8 JASKernel::sAramBase[4];
|
||||
u32 JASKernel::sAramBase;
|
||||
|
||||
/* 80451218-8045121C 000718 0004+00 2/1 0/0 0/0 .sbss sSystemHeap__9JASKernel */
|
||||
JKRHeap* JASKernel::sSystemHeap;
|
||||
|
||||
/* 8045121C-80451220 00071C 0004+00 2/1 0/0 0/0 .sbss sCommandHeap__9JASKernel */
|
||||
u8 JASKernel::sCommandHeap[4];
|
||||
void* JASKernel::sCommandHeap;
|
||||
|
||||
/* 802909B8-80290AC0 28B2F8 0108+00 0/0 1/1 0/0 .text setupRootHeap__9JASKernelFP12JKRSolidHeapUl
|
||||
*/
|
||||
// implement JASMemChunkPool
|
||||
#ifdef NONMATCHING
|
||||
void JASKernel::setupRootHeap(JKRSolidHeap* heap, u32 size) {
|
||||
JUT_ASSERT(784, heap);
|
||||
sSystemHeap = JKRExpHeap::create(size, heap, false);
|
||||
JUT_ASSERT(787, sSystemHeap);
|
||||
sCommandHeap = new JASMemChunkPool();
|
||||
JUT_ASSERT(790, sCommandHeap);
|
||||
JASDram = heap;
|
||||
}
|
||||
#else
|
||||
#pragma push
|
||||
#pragma optimization_level 0
|
||||
#pragma optimizewithasm off
|
||||
@@ -252,6 +363,7 @@ asm void JASKernel::setupRootHeap(JKRSolidHeap* param_0, u32 param_1) {
|
||||
#include "asm/JSystem/JAudio2/JASHeapCtrl/setupRootHeap__9JASKernelFP12JKRSolidHeapUl.s"
|
||||
}
|
||||
#pragma pop
|
||||
#endif
|
||||
|
||||
/* 80290AC0-80290AC8 -00001 0008+00 0/0 0/0 0/0 .text getSystemHeap__9JASKernelFv */
|
||||
JKRHeap* JASKernel::getSystemHeap() {
|
||||
@@ -259,8 +371,8 @@ JKRHeap* JASKernel::getSystemHeap() {
|
||||
}
|
||||
|
||||
/* 80290AC8-80290AD0 -00001 0008+00 0/0 0/0 0/0 .text getCommandHeap__9JASKernelFv */
|
||||
u32 JASKernel::getCommandHeap() {
|
||||
return *(u32*)(&JASKernel::sCommandHeap);
|
||||
void* JASKernel::getCommandHeap() {
|
||||
return JASKernel::sCommandHeap;
|
||||
}
|
||||
|
||||
/* ############################################################################################## */
|
||||
@@ -271,24 +383,15 @@ static u8 lit_313[12];
|
||||
u8 JASKernel::audioAramHeap[68];
|
||||
|
||||
/* 80290AD0-80290B08 28B410 0038+00 0/0 1/1 0/0 .text setupAramHeap__9JASKernelFUlUl */
|
||||
#pragma push
|
||||
#pragma optimization_level 0
|
||||
#pragma optimizewithasm off
|
||||
asm void JASKernel::setupAramHeap(u32 param_0, u32 param_1) {
|
||||
nofralloc
|
||||
#include "asm/JSystem/JAudio2/JASHeapCtrl/setupAramHeap__9JASKernelFUlUl.s"
|
||||
void JASKernel::setupAramHeap(u32 param_0, u32 param_1) {
|
||||
sAramBase = param_0;
|
||||
(*(JASHeap*)audioAramHeap).initRootHeap((void*)sAramBase, param_1);
|
||||
}
|
||||
#pragma pop
|
||||
|
||||
/* 80290B08-80290B14 28B448 000C+00 0/0 3/2 0/0 .text getAramHeap__9JASKernelFv */
|
||||
#pragma push
|
||||
#pragma optimization_level 0
|
||||
#pragma optimizewithasm off
|
||||
asm JASHeap* JASKernel::getAramHeap() {
|
||||
nofralloc
|
||||
#include "asm/JSystem/JAudio2/JASHeapCtrl/getAramHeap__9JASKernelFv.s"
|
||||
JASHeap* JASKernel::getAramHeap() {
|
||||
return (JASHeap*)audioAramHeap;
|
||||
}
|
||||
#pragma pop
|
||||
|
||||
/* 80290B14-80290B54 28B454 0040+00 0/0 1/0 0/0 .text __sinit_JASHeapCtrl_cpp */
|
||||
#pragma push
|
||||
|
||||
@@ -130,8 +130,8 @@ int JASTaskThread::sendCmdMsg(void (*param_0)(void*), void const* param_1, u32 p
|
||||
}
|
||||
int iVar2 = sendMessage(pvVar1);
|
||||
if (iVar2 == 0) {
|
||||
u32 heap = JASKernel::getCommandHeap();
|
||||
((ThreadMemPool*)pvVar1)->free((void*)heap);
|
||||
void* heap = JASKernel::getCommandHeap();
|
||||
((ThreadMemPool*)pvVar1)->free(heap);
|
||||
}
|
||||
return iVar2;
|
||||
}
|
||||
@@ -146,8 +146,8 @@ int JASTaskThread::sendCmdMsg(void (*param_0)(void*), void* param_1) {
|
||||
}
|
||||
int iVar2 = sendMessage(pvVar1);
|
||||
if (iVar2 == 0) {
|
||||
u32 heap = JASKernel::getCommandHeap();
|
||||
((ThreadMemPool*)pvVar1)->free((void*)heap);
|
||||
void* heap = JASKernel::getCommandHeap();
|
||||
((ThreadMemPool*)pvVar1)->free(heap);
|
||||
}
|
||||
return iVar2;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user