NSMBW-Decomp
A decompilation of New Super Mario Bros. Wii
Loading...
Searching...
No Matches
m_allocator.cpp
1#include <game/mLib/m_allocator_dummy_heap.hpp>
2#include <game/mLib/m_allocator.hpp>
3#include <game/mLib/m_heap.hpp>
4#include <lib/egg/heap/eggFrmHeap.hpp>
5
6mAllocatorDummyHeap_c *mAllocatorDummyHeap_c::m_instance;
7
8/// @unofficial
9void *dummyHeapAlloc(MEMAllocator *, size_t) { return nullptr; }
10
11/// @unofficial
12void dummyHeapFree(MEMAllocator *, void *) {}
13
14mAllocatorDummyHeap_c::mAllocatorDummyHeap_c() {
15 m_instance = this;
16}
17
18mAllocatorDummyHeap_c::~mAllocatorDummyHeap_c() {}
19
20int mAllocatorDummyHeap_c::getHeapKind() const {
21 return 0;
22}
23
24void mAllocatorDummyHeap_c::initAllocator(EGG::Allocator *allocator, long alignment) {
25 const static MEMAllocatorFuncs funcs = { dummyHeapAlloc, dummyHeapFree };
26 allocator->mpFuncs = &funcs;
27 allocator->mpHeapHandle = mpHeapHandle;
28 allocator->mAlignment = alignment;
29 allocator->mUnused = 0;
30}
31
32void *mAllocatorDummyHeap_c::alloc(size_t bytes, long alignment) {
33 return nullptr;
34}
35
36void mAllocatorDummyHeap_c::free(void *ptr) {}
37
38void mAllocatorDummyHeap_c::destroy() {}
39
40void *mAllocatorDummyHeap_c::resizeForMBlock(void *ptr, size_t newSize) {
41 return 0;
42}
43
44u32 mAllocatorDummyHeap_c::getTotalFreeSize() {
45 return 0;
46}
47
48u32 mAllocatorDummyHeap_c::getAllocatableSize(long alignment) {
49 return 0;
50}
51
52bool mAllocatorDummyHeap_c::adjust() {
53 return 0;
54}
55
56mAllocatorDummyHeap_c *mAllocatorDummyHeap_c::getInstance() {
57 return m_instance;
58}
59
60mAllocator_c::mAllocator_c() : EGG::Allocator(mAllocatorDummyHeap_c::getInstance(), 4) {
61}
62
64
65bool mAllocator_c::attach(EGG::Heap *heap, int alignment) {
66 if (heap == nullptr) {
67 heap = EGG::Heap::sCurrentHeap;
68 }
69 mAlign = alignment;
70 mpHeap = heap;
71 heap->initAllocator(this, alignment);
72 return true;
73}
74
75void *mAllocator_c::alloc(size_t size) {
76 return EGG::Allocator::alloc(size);
77}
78
79void mAllocator_c::free(void *ptr) {
80 EGG::Allocator::free(ptr);
81}
82
83void mAllocator_c::init(EGG::Heap *heap) {
84 new(heap, 4) mAllocatorDummyHeap_c();
85}
86
88
92
93bool mHeapAllocator_c::createHeap(size_t size, EGG::Heap *parent, const char *name, u32 align, u32 opt) {
95 EGG::FrmHeap *heap = mHeap::createFrmHeap(size, parent, name, align, opt);
96 if (heap == nullptr) {
97 return false;
98 }
99
100 attach(heap, align);
101 return true;
102}
103
105 EGG::Heap *dummyHeap = mAllocatorDummyHeap_c::getInstance();
106 if (mpHeap != dummyHeap) {
107 mpHeap->destroy();
108 mpHeap = dummyHeap;
109 }
110}
111
112size_t mHeapAllocator_c::adjustFrmHeap() {
113 EGG::Heap *dummyHeap = mAllocatorDummyHeap_c::getInstance();
114 if (mpHeap == dummyHeap) {
115 return 0;
116 }
117
118 EGG::FrmHeap *heap = mpHeap->toFrmHeap();
119 return mHeap::adjustFrmHeap(heap);
120}
121
122bool mHeapAllocator_c::createHeapRestoreCurrent(size_t size, EGG::Heap *parent, const char *name, u32 align, u32 opt) {
123 if (!createHeap(size, parent, name, align, opt)) {
124 return false;
125 }
126
127 mHeap::saveCurrentHeap();
128 mHeap::setCurrentHeap(mpHeap);
129 return true;
130}
131
132size_t mHeapAllocator_c::adjustFrmHeapRestoreCurrent() {
133 mHeap::restoreCurrentHeap();
134 EGG::FrmHeap *heap = mpHeap->toFrmHeap();
135 return mHeap::adjustFrmHeap(heap);
136}
A non-functional heap to be used when mHeapAllocator_c does not have a proper heap.
mAllocator_c()
Constructs a new allocator.
virtual ~mAllocator_c()
Destroys the allocator.
void destroyHeap()
destroys the underlying heap and replaces it with the dummy heap;
virtual ~mHeapAllocator_c()
Destroys the heap allocator.
bool createHeapRestoreCurrent(size_t size, EGG::Heap *parent, const char *name, u32 align, u32 opt)
mHeapAllocator_c()
Constructs a new heap allocator.
bool createHeap(size_t size, EGG::Heap *parent, const char *name, u32 align, u32 opt)