Files
tp/libs/JSystem/JAudio2/JASHeapCtrl.cpp
T

426 lines
13 KiB
C++
Raw Normal View History

2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
// Generated By: dol2asm
// Translation Unit: JASHeapCtrl
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
2021-04-01 02:07:58 +02:00
#include "JSystem/JAudio2/JASHeapCtrl.h"
2023-10-20 09:36:29 -07:00
#include "JSystem/JAudio2/JASMutex.h"
#include "JSystem/JKernel/JKRExpHeap.h"
#include "JSystem/JKernel/JKRSolidHeap.h"
#include "JSystem/JUtility/JUTAssert.h"
2021-03-28 22:49:05 +02:00
#include "dol2asm.h"
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
// Types:
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
struct JASDisposer {
2023-10-20 09:36:29 -07:00
virtual ~JASDisposer();
/* 80290BCC */ virtual void onDispose();
2021-03-28 22:49:05 +02:00
};
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
// Forward References:
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
extern "C" void __ct__7JASHeapFP11JASDisposer();
extern "C" void initRootHeap__7JASHeapFPvUl();
extern "C" void alloc__7JASHeapFP7JASHeapUl();
extern "C" void allocTail__7JASHeapFP7JASHeapUl();
extern "C" void free__7JASHeapFv();
extern "C" void insertChild__7JASHeapFP7JASHeapP7JASHeapPvUlb();
extern "C" void getTailHeap__7JASHeapFv();
extern "C" void getTailOffset__7JASHeapFv();
extern "C" void getCurOffset__7JASHeapFv();
extern "C" void __ct__17JASGenericMemPoolFv();
extern "C" void __dt__17JASGenericMemPoolFv();
extern "C" void newMemPool__17JASGenericMemPoolFUli();
extern "C" void alloc__17JASGenericMemPoolFUl();
extern "C" void free__17JASGenericMemPoolFPvUl();
extern "C" void setupRootHeap__9JASKernelFP12JKRSolidHeapUl();
2021-04-08 21:05:48 +02:00
extern "C" u32 getSystemHeap__9JASKernelFv();
extern "C" u32 getCommandHeap__9JASKernelFv();
2021-03-28 22:49:05 +02:00
extern "C" void setupAramHeap__9JASKernelFUlUl();
extern "C" void getAramHeap__9JASKernelFv();
extern "C" void __sinit_JASHeapCtrl_cpp();
extern "C" void __dt__7JASHeapFv();
extern "C" void onDispose__11JASDisposerFv();
2021-04-08 01:47:05 +02:00
extern "C" u8 audioAramHeap__9JASKernel[68];
extern "C" u8 sAramBase__9JASKernel[4];
extern "C" u8 sSystemHeap__9JASKernel[4];
extern "C" u8 sCommandHeap__9JASKernel[4];
2021-03-28 22:49:05 +02:00
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
// External References:
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
extern "C" void* __nw__FUlP7JKRHeapi();
extern "C" void* __nwa__FUlP7JKRHeapi();
extern "C" void __dl__FPv();
extern "C" void __dla__FPv();
extern "C" void create__10JKRExpHeapFUlP7JKRHeapb();
extern "C" void __ct__10JSUPtrLinkFPv();
extern "C" void __dt__10JSUPtrLinkFv();
extern "C" void __dt__10JSUPtrListFv();
extern "C" void initiate__10JSUPtrListFv();
extern "C" void insert__10JSUPtrListFP10JSUPtrLinkP10JSUPtrLink();
extern "C" void remove__10JSUPtrListFP10JSUPtrLink();
extern "C" void __register_global_object();
extern "C" void _savegpr_26();
extern "C" void _savegpr_27();
extern "C" void _savegpr_28();
extern "C" void _savegpr_29();
extern "C" void _restgpr_26();
extern "C" void _restgpr_27();
extern "C" void _restgpr_28();
extern "C" void _restgpr_29();
2021-04-08 01:47:05 +02:00
extern "C" u8 sSystemHeap__7JKRHeap[4];
2021-03-28 22:49:05 +02:00
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
// Declarations:
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
2021-04-06 18:00:35 +02:00
/* 80290140-802901AC 28AA80 006C+00 1/1 2/2 0/0 .text __ct__7JASHeapFP11JASDisposer */
2023-10-20 09:36:29 -07:00
JASHeap::JASHeap(JASDisposer* disposer) : mTree(this) {
mDisposer = disposer;
mBase = NULL;
mSize = 0;
field_0x40 = 0;
OSInitMutex(&mMutex);
2021-03-28 22:49:05 +02:00
}
2021-04-06 18:00:35 +02:00
/* 802901AC-8029021C 28AAEC 0070+00 1/1 0/0 0/0 .text initRootHeap__7JASHeapFPvUl */
2023-10-20 09:36:29 -07:00
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));
2021-03-28 22:49:05 +02:00
}
2021-04-06 18:00:35 +02:00
/* 8029021C-802903F4 28AB5C 01D8+00 0/0 2/2 0/0 .text alloc__7JASHeapFP7JASHeapUl */
2023-10-20 09:36:29 -07:00
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;
2021-03-28 22:49:05 +02:00
}
2021-04-06 18:00:35 +02:00
/* 802903F4-802904E4 28AD34 00F0+00 0/0 1/1 0/0 .text allocTail__7JASHeapFP7JASHeapUl */
2021-03-28 22:49:05 +02:00
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
2023-09-07 09:50:36 -07:00
asm bool JASHeap::allocTail(JASHeap* param_0, u32 param_1) {
2021-04-01 02:07:58 +02:00
nofralloc
2021-03-28 22:49:05 +02:00
#include "asm/JSystem/JAudio2/JASHeapCtrl/allocTail__7JASHeapFP7JASHeapUl.s"
}
#pragma pop
2021-04-06 18:00:35 +02:00
/* 802904E4-80290608 28AE24 0124+00 0/0 4/4 0/0 .text free__7JASHeapFv */
2023-10-20 09:36:29 -07:00
// 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
2021-03-28 22:49:05 +02:00
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
2023-10-20 09:36:29 -07:00
asm bool JASHeap::free() {
2021-04-01 02:07:58 +02:00
nofralloc
2021-03-28 22:49:05 +02:00
#include "asm/JSystem/JAudio2/JASHeapCtrl/free__7JASHeapFv.s"
}
#pragma pop
2023-10-20 09:36:29 -07:00
#endif
2021-03-28 22:49:05 +02:00
2021-04-06 18:00:35 +02:00
/* 80290608-802906F0 28AF48 00E8+00 2/2 0/0 0/0 .text
* insertChild__7JASHeapFP7JASHeapP7JASHeapPvUlb */
2023-10-20 09:36:29 -07:00
// 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
2021-03-28 22:49:05 +02:00
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
2021-04-01 02:07:58 +02:00
asm void JASHeap::insertChild(JASHeap* param_0, JASHeap* param_1, void* param_2, u32 param_3,
bool param_4) {
nofralloc
2021-03-28 22:49:05 +02:00
#include "asm/JSystem/JAudio2/JASHeapCtrl/insertChild__7JASHeapFP7JASHeapP7JASHeapPvUlb.s"
}
#pragma pop
2023-10-20 09:36:29 -07:00
#endif
2021-03-28 22:49:05 +02:00
2021-04-06 18:00:35 +02:00
/* 802906F0-8029077C 28B030 008C+00 3/3 0/0 0/0 .text getTailHeap__7JASHeapFv */
2023-10-20 09:36:29 -07:00
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();
2021-03-28 22:49:05 +02:00
}
2021-04-06 18:00:35 +02:00
/* 8029077C-802907E0 28B0BC 0064+00 2/2 0/0 0/0 .text getTailOffset__7JASHeapFv */
2023-10-20 09:36:29 -07:00
u32 JASHeap::getTailOffset() {
JASMutexLock lock(&mMutex);
JASHeap* heap = getTailHeap();
u32 offset = !heap ? mSize : heap->mBase - mBase;
return offset;
2021-03-28 22:49:05 +02:00
}
2021-04-06 18:00:35 +02:00
/* 802907E0-80290848 28B120 0068+00 2/2 0/0 0/0 .text getCurOffset__7JASHeapFv */
2023-10-20 09:36:29 -07:00
u32 JASHeap::getCurOffset() {
JASMutexLock lock(&mMutex);
u32 offset = !field_0x40 ? 0 : field_0x40->mBase + field_0x40->mSize - mBase;
return offset;
2021-03-28 22:49:05 +02:00
}
2021-04-06 18:00:35 +02:00
/* 80290848-80290860 28B188 0018+00 0/0 32/32 0/0 .text __ct__17JASGenericMemPoolFv */
2023-10-20 09:36:29 -07:00
JASGenericMemPool::JASGenericMemPool() {
field_0x0 = NULL;
freeMemCount = 0;
totalMemCount = 0;
field_0xc = 0;
2021-03-28 22:49:05 +02:00
}
2021-04-06 18:00:35 +02:00
/* 80290860-802908C8 28B1A0 0068+00 0/0 9/9 0/0 .text __dt__17JASGenericMemPoolFv */
2021-03-28 22:49:05 +02:00
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JASGenericMemPool::~JASGenericMemPool() {
2021-04-01 02:07:58 +02:00
nofralloc
2021-03-28 22:49:05 +02:00
#include "asm/JSystem/JAudio2/JASHeapCtrl/__dt__17JASGenericMemPoolFv.s"
}
#pragma pop
/* ############################################################################################## */
2021-04-06 18:00:35 +02:00
/* 80451210-80451214 000710 0004+00 2/2 15/15 0/0 .sbss JASDram */
2023-08-02 11:30:52 +03:00
JKRSolidHeap* JASDram;
2021-03-28 22:49:05 +02:00
2021-04-06 18:00:35 +02:00
/* 802908C8-80290948 28B208 0080+00 0/0 4/4 0/0 .text newMemPool__17JASGenericMemPoolFUli
*/
2021-03-28 22:49:05 +02:00
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JASGenericMemPool::newMemPool(u32 param_0, int param_1) {
2021-04-01 02:07:58 +02:00
nofralloc
2021-03-28 22:49:05 +02:00
#include "asm/JSystem/JAudio2/JASHeapCtrl/newMemPool__17JASGenericMemPoolFUli.s"
}
#pragma pop
2021-04-06 18:00:35 +02:00
/* 80290948-80290994 28B288 004C+00 0/0 13/13 0/0 .text alloc__17JASGenericMemPoolFUl */
2021-03-28 22:49:05 +02:00
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
2023-07-20 02:43:10 -07:00
asm void* JASGenericMemPool::alloc(u32 param_0) {
2021-04-01 02:07:58 +02:00
nofralloc
2021-03-28 22:49:05 +02:00
#include "asm/JSystem/JAudio2/JASHeapCtrl/alloc__17JASGenericMemPoolFUl.s"
}
#pragma pop
2021-04-06 18:00:35 +02:00
/* 80290994-802909B8 28B2D4 0024+00 0/0 15/15 0/0 .text free__17JASGenericMemPoolFPvUl */
2021-03-28 22:49:05 +02:00
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JASGenericMemPool::free(void* param_0, u32 param_1) {
2021-04-01 02:07:58 +02:00
nofralloc
2021-03-28 22:49:05 +02:00
#include "asm/JSystem/JAudio2/JASHeapCtrl/free__17JASGenericMemPoolFPvUl.s"
}
#pragma pop
/* ############################################################################################## */
2021-04-06 18:00:35 +02:00
/* 80451214-80451218 000714 0004+00 1/1 0/0 0/0 .sbss sAramBase__9JASKernel */
2023-10-20 09:36:29 -07:00
u32 JASKernel::sAramBase;
2021-03-28 22:49:05 +02:00
2021-04-08 21:05:48 +02:00
/* 80451218-8045121C 000718 0004+00 2/1 0/0 0/0 .sbss sSystemHeap__9JASKernel */
2023-09-07 09:50:36 -07:00
JKRHeap* JASKernel::sSystemHeap;
2021-03-28 22:49:05 +02:00
2021-04-08 21:05:48 +02:00
/* 8045121C-80451220 00071C 0004+00 2/1 0/0 0/0 .sbss sCommandHeap__9JASKernel */
2023-10-20 09:36:29 -07:00
void* JASKernel::sCommandHeap;
2021-03-28 22:49:05 +02:00
2021-04-06 18:00:35 +02:00
/* 802909B8-80290AC0 28B2F8 0108+00 0/0 1/1 0/0 .text setupRootHeap__9JASKernelFP12JKRSolidHeapUl
2021-04-01 02:07:58 +02:00
*/
2023-10-20 09:36:29 -07:00
// 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
2021-03-28 22:49:05 +02:00
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JASKernel::setupRootHeap(JKRSolidHeap* param_0, u32 param_1) {
2021-04-01 02:07:58 +02:00
nofralloc
2021-03-28 22:49:05 +02:00
#include "asm/JSystem/JAudio2/JASHeapCtrl/setupRootHeap__9JASKernelFP12JKRSolidHeapUl.s"
}
#pragma pop
2023-10-20 09:36:29 -07:00
#endif
2021-03-28 22:49:05 +02:00
2021-04-08 21:05:48 +02:00
/* 80290AC0-80290AC8 -00001 0008+00 0/0 0/0 0/0 .text getSystemHeap__9JASKernelFv */
2023-09-07 09:50:36 -07:00
JKRHeap* JASKernel::getSystemHeap() {
return JASKernel::sSystemHeap;
2021-03-28 22:49:05 +02:00
}
2021-04-08 21:05:48 +02:00
/* 80290AC8-80290AD0 -00001 0008+00 0/0 0/0 0/0 .text getCommandHeap__9JASKernelFv */
2023-10-20 09:36:29 -07:00
void* JASKernel::getCommandHeap() {
return JASKernel::sCommandHeap;
2021-03-28 22:49:05 +02:00
}
/* ############################################################################################## */
2021-04-06 18:00:35 +02:00
/* 804315D0-804315DC 05E2F0 000C+00 1/1 0/0 0/0 .bss @313 */
2021-03-28 22:49:05 +02:00
static u8 lit_313[12];
2021-04-06 18:00:35 +02:00
/* 804315DC-80431620 05E2FC 0044+00 3/3 0/0 0/0 .bss audioAramHeap__9JASKernel */
2021-04-08 01:47:05 +02:00
u8 JASKernel::audioAramHeap[68];
2021-03-28 22:49:05 +02:00
2021-04-06 18:00:35 +02:00
/* 80290AD0-80290B08 28B410 0038+00 0/0 1/1 0/0 .text setupAramHeap__9JASKernelFUlUl */
2023-10-20 09:36:29 -07:00
void JASKernel::setupAramHeap(u32 param_0, u32 param_1) {
sAramBase = param_0;
(*(JASHeap*)audioAramHeap).initRootHeap((void*)sAramBase, param_1);
2021-03-28 22:49:05 +02:00
}
2021-04-06 18:00:35 +02:00
/* 80290B08-80290B14 28B448 000C+00 0/0 3/2 0/0 .text getAramHeap__9JASKernelFv */
2023-10-20 09:36:29 -07:00
JASHeap* JASKernel::getAramHeap() {
return (JASHeap*)audioAramHeap;
2021-03-28 22:49:05 +02:00
}
2021-04-06 18:00:35 +02:00
/* 80290B14-80290B54 28B454 0040+00 0/0 1/0 0/0 .text __sinit_JASHeapCtrl_cpp */
2021-03-28 22:49:05 +02:00
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
2021-04-06 18:00:35 +02:00
asm void __sinit_JASHeapCtrl_cpp() {
2021-04-01 02:07:58 +02:00
nofralloc
2021-03-28 22:49:05 +02:00
#include "asm/JSystem/JAudio2/JASHeapCtrl/__sinit_JASHeapCtrl_cpp.s"
}
#pragma pop
2021-03-31 23:22:32 +02:00
#pragma push
#pragma force_active on
REGISTER_CTORS(0x80290B14, __sinit_JASHeapCtrl_cpp);
2021-03-31 23:22:32 +02:00
#pragma pop
2021-04-06 18:00:35 +02:00
/* 80290B54-80290BCC 28B494 0078+00 1/1 3/3 0/0 .text __dt__7JASHeapFv */
2021-03-28 22:49:05 +02:00
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
//asm JASHeap::~JASHeap() {
asm void __dt__7JASHeapFv() {
2021-04-01 02:07:58 +02:00
nofralloc
2021-03-28 22:49:05 +02:00
#include "asm/JSystem/JAudio2/JASHeapCtrl/__dt__7JASHeapFv.s"
}
#pragma pop
2021-04-06 18:00:35 +02:00
/* 80290BCC-80290BD0 28B50C 0004+00 0/0 1/0 0/0 .text onDispose__11JASDisposerFv */
2021-03-28 22:49:05 +02:00
void JASDisposer::onDispose() {
2021-04-01 02:07:58 +02:00
/* empty function */
2021-03-28 22:49:05 +02:00
}