mirror of https://github.com/PrimeDecomp/prime.git
parent
90df73af90
commit
58d095dcd4
|
@ -590,7 +590,7 @@ LIBS = [
|
|||
"Kyoto/Math/RMathUtils",
|
||||
["Kyoto/CCrc32", True],
|
||||
["Kyoto/Alloc/CCircularBuffer", True],
|
||||
"Kyoto/Alloc/CMemory",
|
||||
["Kyoto/Alloc/CMemory", True],
|
||||
["Kyoto/Alloc/IAllocator", True],
|
||||
"Kyoto/PVS/CPVSVisOctree",
|
||||
"Kyoto/PVS/CPVSVisSet",
|
||||
|
|
|
@ -2,11 +2,23 @@
|
|||
#define _CMEMORY
|
||||
|
||||
#include "types.h"
|
||||
#include "Kyoto/Alloc/IAllocator.hpp"
|
||||
|
||||
namespace CMemory {
|
||||
void* Alloc(size_t sz);
|
||||
void Free(const void* ptr);
|
||||
} // namespace CMemory
|
||||
class COsContext;
|
||||
class CMemory {
|
||||
static IAllocator* mpAllocator;
|
||||
static bool mInitialized;
|
||||
|
||||
public:
|
||||
static void Startup(COsContext& ctx);
|
||||
static void Shutdown();
|
||||
static void SetAllocator(COsContext& ctx, IAllocator& allocator);
|
||||
static IAllocator* GetAllocator();
|
||||
static void* Alloc(size_t len, IAllocator::EHint hint, IAllocator::EScope scope, IAllocator::EType type, const CCallStack& callstack);
|
||||
static void Free(const void* ptr);
|
||||
static void SetOutOfMemoryCallback(IAllocator::FOutOfMemoryCb callback, const void* context);
|
||||
static void OffsetFakeStatics(int);
|
||||
};
|
||||
|
||||
void* operator new(size_t sz, const char*, const char*);
|
||||
void* operator new[](size_t sz, const char*, const char*);
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
#ifndef _IALLOCATOR
|
||||
#define _IALLOCATOR
|
||||
|
||||
#include "Kyoto/Alloc/CMemory.hpp"
|
||||
#include "types.h"
|
||||
#include <stddef.h>
|
||||
|
||||
|
@ -22,8 +21,8 @@ public:
|
|||
};
|
||||
|
||||
enum EType {
|
||||
kTP_Unk0,
|
||||
kTP_Unk1,
|
||||
kTP_Heap,
|
||||
kTP_Array,
|
||||
};
|
||||
|
||||
struct SMetrics {
|
||||
|
@ -77,6 +76,7 @@ public:
|
|||
|
||||
typedef const bool (*FOutOfMemoryCb)(const void*, uint);
|
||||
typedef const bool (*FEnumAllocationsCb)(const SAllocInfo& info, const void* ptr);
|
||||
|
||||
virtual ~IAllocator();
|
||||
|
||||
virtual bool Initialize(COsContext& ctx) = 0;
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
#include "Kyoto/Basics/COsContext.hpp"
|
||||
#include "Kyoto/CMemoryCardSys.hpp"
|
||||
#include "Kyoto/CMemorySys.hpp"
|
||||
#include "Kyoto/Alloc/CMemorySys.hpp"
|
||||
#include "Kyoto/CResFactory.hpp"
|
||||
#include "Kyoto/CSimplePool.hpp"
|
||||
#include "Kyoto/CToken.hpp"
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
#include "Kyoto/Basics/COsContext.hpp"
|
||||
#include "Kyoto/Basics/CStopwatch.hpp"
|
||||
#include "Kyoto/CMemorySys.hpp"
|
||||
#include "Kyoto/Alloc/CMemorySys.hpp"
|
||||
#include "Kyoto/Streams/CInputStream.hpp"
|
||||
#include "Kyoto/TReservedAverage.hpp"
|
||||
#include "MetroidPrime/CGameArchitectureSupport.hpp"
|
||||
|
|
|
@ -529,7 +529,7 @@ KYOTO_1 :=\
|
|||
$(BUILD_DIR)/asm/Kyoto/Math/RMathUtils.o\
|
||||
$(BUILD_DIR)/src/Kyoto/CCrc32.o\
|
||||
$(BUILD_DIR)/src/Kyoto/Alloc/CCircularBuffer.o\
|
||||
$(BUILD_DIR)/asm/Kyoto/Alloc/CMemory.o\
|
||||
$(BUILD_DIR)/src/Kyoto/Alloc/CMemory.o\
|
||||
$(BUILD_DIR)/src/Kyoto/Alloc/IAllocator.o\
|
||||
$(BUILD_DIR)/asm/Kyoto/PVS/CPVSVisOctree.o\
|
||||
$(BUILD_DIR)/asm/Kyoto/PVS/CPVSVisSet.o\
|
||||
|
|
|
@ -112,7 +112,7 @@ void* CGameAllocator::Alloc(size_t size, EHint hint, EScope scope, EType type,
|
|||
buf = x74_mediumPool->Alloc(size);
|
||||
|
||||
if (buf == nullptr) {
|
||||
buf = Alloc(0x21000, kHI_None, kSC_Unk1, kTP_Unk0,
|
||||
buf = Alloc(0x21000, kHI_None, kSC_Unk1, kTP_Heap,
|
||||
CCallStack(-1, "MediumAllocMainData ", " - Ignore"));
|
||||
x74_mediumPool->AddPuddle(0x1000, buf, 1);
|
||||
buf = x74_mediumPool->Alloc(size);
|
||||
|
|
|
@ -0,0 +1,90 @@
|
|||
#include "Kyoto/Alloc/CMemory.hpp"
|
||||
#include "Kyoto/Alloc/CMemorySys.hpp"
|
||||
|
||||
#include "Kyoto/Alloc/CCallStack.hpp"
|
||||
#include "Kyoto/Alloc/CGameAllocator.hpp"
|
||||
#include "Kyoto/Basics/RAssertDolphin.hpp"
|
||||
|
||||
#include "dolphin/os.h"
|
||||
|
||||
static CGameAllocator gGameAllocator;
|
||||
IAllocator* CMemory::mpAllocator = &gGameAllocator;
|
||||
bool CMemory::mInitialized;
|
||||
uint gLeakCount = 0;
|
||||
uint gLeakBytes = 0;
|
||||
|
||||
CMemorySys::CMemorySys(COsContext& ctx, IAllocator& allocator) {
|
||||
CMemory::Startup(ctx);
|
||||
CMemory::SetAllocator(ctx, allocator);
|
||||
}
|
||||
|
||||
CMemorySys::~CMemorySys() { CMemory::Shutdown(); }
|
||||
|
||||
IAllocator& CMemorySys::GetGameAllocator() { return gGameAllocator; }
|
||||
|
||||
void CMemory::Startup(COsContext& ctx) { mInitialized = mpAllocator->Initialize(ctx); }
|
||||
|
||||
void CMemory::SetAllocator(COsContext& ctx, IAllocator& allocator) {
|
||||
if (mpAllocator != &allocator) {
|
||||
if (mpAllocator != nullptr) {
|
||||
mpAllocator->ReleaseAll();
|
||||
}
|
||||
mpAllocator = &allocator;
|
||||
mpAllocator->Initialize(ctx);
|
||||
}
|
||||
}
|
||||
|
||||
static bool cmemory_enum_alloc_cb(const IAllocator::SAllocInfo& info, const void* ptr) {
|
||||
if (info.x8_isAllocated && info.x9_ == 0) {
|
||||
++gLeakCount;
|
||||
gLeakBytes += info.x4_len;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void CMemory::Shutdown() {
|
||||
CMemory::mInitialized = false;
|
||||
|
||||
if (mpAllocator->GetMetrics().x8_ != 0) {
|
||||
gLeakCount = 0;
|
||||
gLeakBytes = 0;
|
||||
mpAllocator->EnumAllocations((IAllocator::FEnumAllocationsCb)cmemory_enum_alloc_cb, nullptr,
|
||||
false);
|
||||
}
|
||||
mpAllocator->Shutdown();
|
||||
}
|
||||
|
||||
void* CMemory::Alloc(size_t len, IAllocator::EHint hint, IAllocator::EScope scope,
|
||||
IAllocator::EType type, const CCallStack& callstack) {
|
||||
volatile bool enabled = OSDisableInterrupts();
|
||||
void* ret = mpAllocator->Alloc(len, hint, scope, type, callstack);
|
||||
if (ret == nullptr) {
|
||||
rs_debugger_printf("Alloc failed - Size: %d", len);
|
||||
}
|
||||
|
||||
OSRestoreInterrupts(enabled);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void CMemory::Free(const void* ptr) {
|
||||
volatile bool enabled = OSDisableInterrupts();
|
||||
if (ptr != nullptr) {
|
||||
mpAllocator->Free(ptr);
|
||||
}
|
||||
OSRestoreInterrupts(enabled);
|
||||
}
|
||||
|
||||
void CMemory::SetOutOfMemoryCallback(IAllocator::FOutOfMemoryCb cb, const void* context) {
|
||||
mpAllocator->SetOutOfMemoryCallback(cb, context);
|
||||
}
|
||||
|
||||
void CMemory::OffsetFakeStatics(int offset) { mpAllocator->OffsetFakeStatics(offset); }
|
||||
|
||||
void* operator new(size_t sz, const char* fileAndLine, const char* type) {
|
||||
return CMemory::Alloc(sz, IAllocator::kHI_None, IAllocator::kSC_Unk1, IAllocator::kTP_Heap,
|
||||
CCallStack(-1, fileAndLine, type));
|
||||
}
|
||||
void* operator new[](size_t sz, const char* fileAndLine, const char* type) {
|
||||
return CMemory::Alloc(sz, IAllocator::kHI_None, IAllocator::kSC_Unk1, IAllocator::kTP_Array,
|
||||
CCallStack(-1, fileAndLine, type));
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
#include "Kyoto/Alloc/IAllocator.hpp"
|
||||
|
||||
#include "Kyoto/Alloc/CMemory.hpp"
|
||||
#include "Kyoto/Basics/COsContext.hpp"
|
||||
|
||||
IAllocator::SMetrics::SMetrics(uint heapSize, uint unk1, uint unk2, uint unk3, uint unk4,
|
||||
|
|
Loading…
Reference in New Issue