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