Twilight Princess
Decompilation of The Legend of Zelda: Twilight Princess
Loading...
Searching...
No Matches
JKRHeap.h
Go to the documentation of this file.
1#ifndef JKRHEAP_H
2#define JKRHEAP_H
3
5#include <dolphin/os.h>
6#include "global.h"
7#include <new>
8
9class JKRHeap;
10typedef void (*JKRErrorHandler)(void*, u32, int);
11
15
17extern bool data_8074A8D0_debug;
18
23class JKRHeap : public JKRDisposer {
24public:
25 typedef void (*JKRAllocCallback)(u32, int, JKRHeap*, void*);
26 typedef void (*JKRFreeCallback)(void*, JKRHeap*);
27
28 class TState {
29 public:
30 /* 0x00 */ u32 mUsedSize;
31 /* 0x04 */ u32 mCheckCode;
32 /* 0x08 */ u32 mBuf;
33 /* 0x0C */ u32 field_0xc;
34 /* 0x10 */ JKRHeap* mHeap;
35 /* 0x14 */ u32 mId;
36
37 public:
38 u32 getUsedSize() const { return mUsedSize; }
39 u32 getCheckCode() const { return mCheckCode; }
40 JKRHeap* getHeap() const { return mHeap; }
41 u32 getId() const { return mId; }
42 };
43
44public:
45 JKRHeap(u32 size, JKRHeap* parent, bool errorFlag);
46 JKRHeap(void* data, u32 size, JKRHeap* parent, bool errorFlag);
47 virtual ~JKRHeap();
48
51 void destroy();
52
53 void* alloc(u32 size, int alignment);
54 void free(void* ptr);
55 void freeAll();
56 void freeTail();
57 s32 resize(void* ptr, u32 size);
58 s32 getSize(void* ptr);
60 void* getMaxFreeBlock();
62 s32 changeGroupID(u8 newGroupId);
64 u32 getMaxAllocatableSize(int alignment);
65
66 JKRHeap* find(void* ptr) const;
67 JKRHeap* findAllHeap(void* ptr) const;
68
70 bool dispose(void* ptr, u32 size);
71 void dispose(void* begin, void* end);
72 void dispose();
73
74 bool setErrorFlag(bool errorFlag);
75 bool isSubHeap(JKRHeap* heap) const;
76 void* getAltAramStartAdr();
77
78 /* vt[03] */ virtual void callAllDisposer();
79 /* vt[04] */ virtual u32 getHeapType() = 0;
80 /* vt[05] */ virtual bool check() = 0;
81 /* vt[06] */ virtual bool dump_sort();
82 /* vt[07] */ virtual bool dump() = 0;
83 /* vt[08] */ virtual void do_destroy() = 0;
84 /* vt[09] */ virtual void* do_alloc(u32 size, int alignment) = 0;
85 /* vt[10] */ virtual void do_free(void* ptr) = 0;
86 /* vt[11] */ virtual void do_freeAll() = 0;
87 /* vt[12] */ virtual void do_freeTail() = 0;
88 /* vt[13] */ virtual void do_fillFreeArea() = 0;
89 /* vt[14] */ virtual s32 do_resize(void* ptr, u32 size) = 0;
90 /* vt[15] */ virtual s32 do_getSize(void* ptr) = 0;
91 /* vt[16] */ virtual s32 do_getFreeSize() = 0;
92 /* vt[17] */ virtual void* do_getMaxFreeBlock() = 0;
93 /* vt[18] */ virtual s32 do_getTotalFreeSize() = 0;
94 /* vt[19] */ virtual s32 do_changeGroupID(u8 newGroupID);
95 /* vt[20] */ virtual u8 do_getCurrentGroupId();
96 /* vt[21] */ virtual void state_register(JKRHeap::TState* p, u32 id) const;
97 /* vt[22] */ virtual bool state_compare(JKRHeap::TState const& r1, JKRHeap::TState const& r2) const;
98 /* vt[23] */ virtual void state_dump(JKRHeap::TState const& p) const;
99
100 void setDebugFill(bool debugFill) { mDebugFill = debugFill; }
101 bool getDebugFill() const { return mDebugFill; }
102 void* getStartAddr() { return (void*)mStart; }
103 void* getEndAddr() { return (void*)mEnd; }
104 u32 getSize() const { return mSize; }
105 bool getErrorFlag() const { return mErrorFlag; }
106 void callErrorHandler(void* heap, u32 size, int alignment) {
107 if (mErrorHandler) {
108 (*mErrorHandler)(heap, size, alignment);
109 }
110 }
111
113
115 void appendDisposer(JKRDisposer* disposer) { mDisposerList.append(&disposer->mLink); }
116 void removeDisposer(JKRDisposer* disposer) { mDisposerList.remove(&disposer->mLink); }
117 void lock() const { OSLockMutex(const_cast<OSMutex*>(&mMutex)); }
118 void unlock() const { OSUnlockMutex(const_cast<OSMutex*>(&mMutex)); }
119 u32 getHeapSize() { return mSize; }
120
121protected:
122 /* 0x00 */ // vtable
123 /* 0x04 */ // JKRDisposer
124 /* 0x18 */ OSMutex mMutex;
125 /* 0x30 */ u8* mStart;
126 /* 0x34 */ u8* mEnd;
127 /* 0x38 */ u32 mSize;
128 /* 0x3C */ bool mDebugFill;
129 /* 0x3D */ bool mCheckMemoryFilled;
130 /* 0x3E */ u8 mAllocationMode; // EAllocMode?
131 /* 0x3F */ u8 mGroupId;
134 /* 0x68 */ bool mErrorFlag;
135 /* 0x69 */ bool mInitFlag;
136
137public:
138 static bool initArena(char** memory, u32* size, int maxHeaps);
139 static bool initArena2(char** memory, u32* size, int maxHeaps);
140 static void* alloc(u32 size, int alignment, JKRHeap* heap);
141 static void free(void* ptr, JKRHeap* heap);
142 static s32 resize(void* ptr, u32 size, JKRHeap* heap);
143 static s32 getSize(void* ptr, JKRHeap* heap);
144 static JKRHeap* findFromRoot(void* ptr);
145
146 static void copyMemory(void* dst, void* src, u32 size);
147 static void fillMemory(void* dst, u32 size, u8 value); // NOTE: never used
148 static bool checkMemoryFilled(void* src, u32 size, u8 value);
149
151 static void fillMemory(u8*, u32, u8);
152 static bool checkMemoryFilled(u8*, u32, u8);
153
154 static bool isDefaultDebugFill() { return sDefaultFillFlag; }
156 static void* getCodeStart(void) { return mCodeStart; }
157 static void* getCodeEnd(void) { return mCodeEnd; }
158 static void* getUserRamStart(void) { return mUserRamStart; }
159 static void* getUserRamEnd(void) { return mUserRamEnd; }
160 static u32 getMemorySize(void) { return mMemorySize; }
161 static JKRHeap* getRootHeap() { return sRootHeap; }
162
163 static JKRHeap* getRootHeap2() { return sRootHeap2; }
164
165 static JKRHeap* getSystemHeap() { return sSystemHeap; }
166 static JKRHeap* getCurrentHeap() { return sCurrentHeap; }
167 static void setSystemHeap(JKRHeap* heap) { sSystemHeap = heap; }
168 static void setCurrentHeap(JKRHeap* heap) { sCurrentHeap = heap; }
169
170 static void setState_u32ID_(TState* state, u32 id) { state->mId = id; }
171 static void setState_uUsedSize_(TState* state, u32 usedSize) { state->mUsedSize = usedSize; }
172 static void setState_u32CheckCode_(TState* state, u32 checkCode) {
173 state->mCheckCode = checkCode;
174 }
175 static void* getState_buf_(TState* state) { return &state->mBuf; }
176
177 static void* mCodeStart;
178 static void* mCodeEnd;
179 static void* mUserRamStart;
180 static void* mUserRamEnd;
184
185 static bool sDefaultFillFlag;
186
188
190
193
195};
196
197void* operator new(size_t size);
198void* operator new(size_t size, int alignment);
199void* operator new(size_t size, JKRHeap* heap, int alignment);
200
201void* operator new[](size_t size);
202void* operator new[](size_t size, int alignment);
203void* operator new[](size_t size, JKRHeap* heap, int alignment);
204
205void operator delete(void* ptr);
206void operator delete[](void* ptr);
207
208void JKRDefaultMemoryErrorRoutine(void* heap, u32 size, int alignment);
209
210inline void* JKRAllocFromHeap(JKRHeap* heap, u32 size, int alignment) {
211 return JKRHeap::alloc(size, alignment, heap);
212}
213
214inline void* JKRAllocFromSysHeap(u32 size, int alignment) {
215 return JKRHeap::getSystemHeap()->alloc(size, alignment);
216}
217
218inline void JKRFreeToHeap(JKRHeap* heap, void* ptr) {
219 JKRHeap::free(ptr, heap);
220}
221
222inline void JKRFreeToSysHeap(void* ptr) {
224}
225
226inline void JKRFree(void* ptr) {
227 JKRHeap::free(ptr, NULL);
228}
229
230inline void JKRFillMemory(u8* dst, u32 size, u8 val) {
231 JKRHeap::fillMemory(dst, size, val);
232}
233
235 return JKRHeap::getSystemHeap();
236}
237
240}
241
243 return heap->becomeCurrentHeap();
244}
245
246inline u32 JKRGetMemBlockSize(JKRHeap* heap, void* block) {
247 return JKRHeap::getSize(block, heap);
248}
249
251 return heap->getFreeSize();
252}
253
254inline void* JKRAlloc(u32 size, int alignment) {
255 return JKRHeap::alloc(size, alignment, NULL);
256}
257
258inline s32 JKRResizeMemBlock(JKRHeap* heap, void* ptr, u32 size) {
259 return JKRHeap::resize(ptr, size, heap);
260}
261
262inline JKRHeap* JKRFindHeap(void* ptr) {
263 return JKRHeap::findFromRoot(ptr);
264}
265
267 return JKRHeap::getRootHeap();
268}
269
271 return JKRHeap::setErrorHandler(errorHandler);
272}
273
274inline bool JKRSetErrorFlag(JKRHeap* heap, bool flag) {
275 return heap->setErrorFlag(flag);
276}
277
279 return JKRHeap::getRootHeap2();
280}
281
282#if DEBUG
286#endif
287
288#endif /* JKRHEAP_H */
static BOOL flag
Definition DEMOAVX.c:20
void JKRFreeToHeap(JKRHeap *heap, void *ptr)
Definition JKRHeap.h:218
s32 JKRResizeMemBlock(JKRHeap *heap, void *ptr, u32 size)
Definition JKRHeap.h:258
JKRHeap * JKRGetCurrentHeap()
Definition JKRHeap.h:238
JKRHeap * JKRGetSystemHeap()
Definition JKRHeap.h:234
void JKRFillMemory(u8 *dst, u32 size, u8 val)
Definition JKRHeap.h:230
void(* JKRErrorHandler)(void *, u32, int)
Definition JKRHeap.h:10
u8 JKRValue_DEBUGFILL_NOTUSE
Definition JKRHeap.cpp:15
u32 JKRGetMemBlockSize(JKRHeap *heap, void *block)
Definition JKRHeap.h:246
JKRHeap * JKRGetRootHeap()
Definition JKRHeap.h:266
JKRHeap * JKRFindHeap(void *ptr)
Definition JKRHeap.h:262
void * JKRAllocFromSysHeap(u32 size, int alignment)
Definition JKRHeap.h:214
void JKRSetDebugFillNew(u8 status)
Definition JKRHeap.h:284
void JKRSetDebugFillDelete(u8 status)
Definition JKRHeap.h:285
JKRHeap * JKRSetCurrentHeap(JKRHeap *heap)
Definition JKRHeap.h:242
bool data_8074A8D0_debug
Definition JKRHeap.cpp:504
u8 JKRValue_DEBUGFILL_DELETE
Definition JKRHeap.cpp:17
void * JKRAlloc(u32 size, int alignment)
Definition JKRHeap.h:254
JKRErrorHandler JKRSetErrorHandler(JKRErrorHandler errorHandler)
Definition JKRHeap.h:270
s32 fillcheck_dispcount
Definition JKRHeap.cpp:503
void JKRFreeToSysHeap(void *ptr)
Definition JKRHeap.h:222
void * JKRAllocFromHeap(JKRHeap *heap, u32 size, int alignment)
Definition JKRHeap.h:210
bool JKRSetErrorFlag(JKRHeap *heap, bool flag)
Definition JKRHeap.h:274
void JKRFree(void *ptr)
Definition JKRHeap.h:226
u8 JKRValue_DEBUGFILL_NEW
Definition JKRHeap.cpp:16
u32 JKRGetFreeSize(JKRHeap *heap)
Definition JKRHeap.h:250
void JKRDefaultMemoryErrorRoutine(void *heap, u32 size, int alignment)
Definition JKRHeap.cpp:400
JKRHeap * JKRGetRootHeap2()
Definition JKRHeap.h:278
void JKRSetDebugFillNotuse(u8 status)
Definition JKRHeap.h:283
static s32 r2
Definition c_math.cpp:168
static s32 r1
Definition c_math.cpp:166
Definition JKRDisposer.h:12
JSULink< JKRDisposer > mLink
Definition JKRDisposer.h:20
Definition JKRHeap.h:28
JKRHeap * getHeap() const
Definition JKRHeap.h:40
u32 getId() const
Definition JKRHeap.h:41
u32 getUsedSize() const
Definition JKRHeap.h:38
JKRHeap * mHeap
Definition JKRHeap.h:34
u32 mUsedSize
Definition JKRHeap.h:30
u32 getCheckCode() const
Definition JKRHeap.h:39
u32 mId
Definition JKRHeap.h:35
u32 mBuf
Definition JKRHeap.h:32
u32 field_0xc
Definition JKRHeap.h:33
u32 mCheckCode
Definition JKRHeap.h:31
Definition JKRHeap.h:23
void callErrorHandler(void *heap, u32 size, int alignment)
Definition JKRHeap.h:106
virtual void state_dump(JKRHeap::TState const &p) const
Definition JKRHeap.cpp:516
OSMutex mMutex
Definition JKRHeap.h:124
JKRHeap * getParent()
Definition JKRHeap.h:112
virtual bool dump_sort()
Definition m_Do_main.cpp:937
static JKRHeap * getCurrentHeap()
Definition JKRHeap.h:166
virtual void state_register(JKRHeap::TState *p, u32 id) const
Definition JKRHeap.cpp:506
static bool isDefaultDebugFill()
Definition JKRHeap.h:154
static void * getUserRamEnd(void)
Definition JKRHeap.h:159
void destroy()
Definition JKRHeap.cpp:156
bool mErrorFlag
Definition JKRHeap.h:134
static void * mCodeEnd
Definition JKRHeap.h:178
JKRHeap * findAllHeap(void *ptr) const
Definition JKRHeap.cpp:332
virtual void * do_getMaxFreeBlock()=0
virtual bool dump()=0
static JKRAllocCallback sAllocCallback
Definition JKRHeap.h:182
virtual s32 do_getTotalFreeSize()=0
static JKRHeap * sCurrentHeap
Definition JKRHeap.h:192
void dispose()
Definition JKRHeap.cpp:383
virtual s32 do_resize(void *ptr, u32 size)=0
bool isSubHeap(JKRHeap *heap) const
Definition JKRHeap.cpp:450
static void * getCodeStart(void)
Definition JKRHeap.h:156
static void * getState_buf_(TState *state)
Definition JKRHeap.h:175
u8 getCurrentGroupId()
Definition JKRHeap.cpp:287
static void setState_uUsedSize_(TState *state, u32 usedSize)
Definition JKRHeap.h:171
static JKRFreeCallback sFreeCallback
Definition JKRHeap.h:183
static JKRHeap * getSystemHeap()
Definition JKRHeap.h:165
void * alloc(u32 size, int alignment)
Definition JKRHeap.cpp:176
static JKRErrorHandler mErrorHandler
Definition JKRHeap.h:194
u8 mAllocationMode
Definition JKRHeap.h:130
static void setState_u32CheckCode_(TState *state, u32 checkCode)
Definition JKRHeap.h:172
JKRHeap * becomeCurrentHeap()
Definition JKRHeap.cpp:150
virtual void callAllDisposer()
Definition JKRHeap.cpp:211
u8 mGroupId
Definition JKRHeap.h:131
bool mDebugFill
Definition JKRHeap.h:128
virtual s32 do_getFreeSize()=0
static void setDefaultDebugFill(bool status)
Definition JKRHeap.h:155
virtual s32 do_changeGroupID(u8 newGroupID)
Definition JKRHeap.cpp:526
bool getDebugFill() const
Definition JKRHeap.h:101
s32 resize(void *ptr, u32 size)
Definition JKRHeap.cpp:247
virtual void * do_alloc(u32 size, int alignment)=0
void * getMaxFreeBlock()
Definition JKRHeap.cpp:272
static void * getUserRamStart(void)
Definition JKRHeap.h:158
void unlock() const
Definition JKRHeap.h:118
void(*) JKRFreeCallback(void *, JKRHeap *)
Definition JKRHeap.h:26
static void setSystemHeap(JKRHeap *heap)
Definition JKRHeap.h:167
s32 getTotalFreeSize()
Definition JKRHeap.cpp:276
static bool sDefaultFillFlag
Definition JKRHeap.h:185
void lock() const
Definition JKRHeap.h:117
JKRHeap * find(void *ptr) const
Definition JKRHeap.cpp:313
static JKRHeap * getRootHeap2()
Definition JKRHeap.h:163
virtual void do_fillFreeArea()=0
void(*) JKRAllocCallback(u32, int, JKRHeap *, void *)
Definition JKRHeap.h:25
virtual u32 getHeapType()=0
void removeDisposer(JKRDisposer *disposer)
Definition JKRHeap.h:116
bool mInitFlag
Definition JKRHeap.h:135
virtual u8 do_getCurrentGroupId()
Definition JKRHeap.cpp:530
void freeTail()
Definition JKRHeap.cpp:226
virtual void do_freeAll()=0
static u32 mMemorySize
Definition JKRHeap.h:181
virtual bool check()=0
virtual void do_free(void *ptr)=0
u32 getHeapSize()
Definition JKRHeap.h:119
static u32 getMemorySize(void)
Definition JKRHeap.h:160
static bool initArena2(char **memory, u32 *size, int maxHeaps)
Definition JKRHeap.cpp:125
static void * mUserRamStart
Definition JKRHeap.h:179
void * getAltAramStartAdr()
Definition JKRHeap.cpp:524
JSUList< JKRDisposer > mDisposerList
Definition JKRHeap.h:133
virtual ~JKRHeap()
Definition JKRHeap.cpp:68
static void * getCodeEnd(void)
Definition JKRHeap.h:157
static bool initArena(char **memory, u32 *size, int maxHeaps)
Definition JKRHeap.cpp:95
static bool checkMemoryFilled(void *src, u32 size, u8 value)
void appendDisposer(JKRDisposer *disposer)
Definition JKRHeap.h:115
void freeAll()
Definition JKRHeap.cpp:219
void dispose_subroutine(u32 start, u32 end)
Definition JKRHeap.cpp:352
static JKRHeap * getRootHeap()
Definition JKRHeap.h:161
u32 getSize() const
Definition JKRHeap.h:104
static JKRErrorHandler setErrorHandler(JKRErrorHandler errorHandler)
Definition JKRHeap.cpp:416
virtual bool state_compare(JKRHeap::TState const &r1, JKRHeap::TState const &r2) const
Definition JKRHeap.cpp:511
u8 * mStart
Definition JKRHeap.h:125
bool mCheckMemoryFilled
Definition JKRHeap.h:129
static JKRHeap * findFromRoot(void *ptr)
Definition JKRHeap.cpp:297
static void setState_u32ID_(TState *state, u32 id)
Definition JKRHeap.h:170
static void copyMemory(void *dst, void *src, u32 size)
Definition JKRHeap.cpp:390
s32 getFreeSize()
Definition JKRHeap.cpp:268
u32 mSize
Definition JKRHeap.h:127
JSUTree< JKRHeap > mChildTree
Definition JKRHeap.h:132
bool getErrorFlag() const
Definition JKRHeap.h:105
void setDebugFill(bool debugFill)
Definition JKRHeap.h:100
JKRHeap * becomeSystemHeap()
Definition JKRHeap.cpp:144
JSUTree< JKRHeap > & getHeapTree()
Definition JKRHeap.h:114
void free(void *ptr)
Definition JKRHeap.cpp:199
JKRHeap(u32 size, JKRHeap *parent, bool errorFlag)
static JKRHeap * sRootHeap2
Definition JKRHeap.h:189
s32 changeGroupID(u8 newGroupId)
Definition JKRHeap.cpp:280
void * getEndAddr()
Definition JKRHeap.h:103
static void fillMemory(void *dst, u32 size, u8 value)
virtual void do_destroy()=0
void * getStartAddr()
Definition JKRHeap.h:102
u8 * mEnd
Definition JKRHeap.h:126
static JKRHeap * sRootHeap
Definition JKRHeap.h:187
static void * mUserRamEnd
Definition JKRHeap.h:180
bool setErrorFlag(bool errorFlag)
Definition JKRHeap.cpp:410
static void * mCodeStart
Definition JKRHeap.h:177
static void setCurrentHeap(JKRHeap *heap)
Definition JKRHeap.h:168
u32 getMaxAllocatableSize(int alignment)
Definition JKRHeap.cpp:291
virtual void do_freeTail()=0
virtual s32 do_getSize(void *ptr)=0
static JKRHeap * sSystemHeap
Definition JKRHeap.h:191
Definition JSUList.h:96
bool remove(JSULink< T > *link)
Definition JSUList.h:113
bool append(JSULink< T > *link)
Definition JSUList.h:105
Definition JSUList.h:188
T * getObject() const
Definition JSUList.h:213
JSUTree< T > * getParent() const
Definition JSUList.h:215
static void end(b_oh_class *i_this)
Definition d_a_b_oh.cpp:343
static u16 const id[4]
Definition d_a_obj_smtile.cpp:269
void OSUnlockMutex(OSMutex *mutex)
Definition OSMutex.c:86
void OSLockMutex(OSMutex *mutex)
Definition OSMutex.c:58
const void * src
Definition __os.h:116
unsigned int size
Definition __os.h:106
p
Definition e_acos.c:103
static u32 status
Definition fstload.c:9
unsigned long u32
Definition types.h:12
signed long s32
Definition types.h:11
unsigned char u8
Definition types.h:8
@ start
Definition strtold.c:23
Definition OSMutex.h:13