Twilight Princess
Decompilation of The Legend of Zelda: Twilight Princess
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
JASHeapCtrl.h
Go to the documentation of this file.
1#ifndef JASHEAPCTRL_H
2#define JASHEAPCTRL_H
3
6#include <dolphin/os.h>
7#include <dolphin/os.h>
8
9class JASDisposer;
10class JKRHeap;
11class JKRSolidHeap;
12
17class JASHeap {
18public:
19 /* 80290140 */ JASHeap(JASDisposer* param_0 = NULL);
20 /* 802901AC */ void initRootHeap(void*, u32);
21 /* 8029021C */ bool alloc(JASHeap*, u32);
22 /* 802903F4 */ bool allocTail(JASHeap*, u32);
23 /* 802904E4 */ bool free();
24 /* 80290608 */ void insertChild(JASHeap*, JASHeap*, void*, u32, bool);
25 /* 802906F0 */ JASHeap* getTailHeap();
26 /* 8029077C */ u32 getTailOffset();
27 /* 802907E0 */ u32 getCurOffset();
28 /* 80290B54 */ ~JASHeap() {}
29
30 void* getBase() { return mBase; }
31 bool isAllocated() { return mBase; }
32 u32 getSize() { return mSize; }
33
35 /* 0x1C */ OSMutex mMutex;
37 /* 0x38 */ u8* mBase;
38 /* 0x3C */ u32 mSize;
39 /* 0x40 */ JASHeap* field_0x40;
40};
41
47 /* 80290848 */ JASGenericMemPool();
48 /* 80290860 */ ~JASGenericMemPool();
49 /* 802908C8 */ void newMemPool(u32, int);
50 /* 80290948 */ void* alloc(u32);
51 /* 80290994 */ void free(void*, u32);
52
53 /* 0x00 */ void* field_0x0;
54 /* 0x04 */ u32 freeMemCount;
55 /* 0x08 */ u32 totalMemCount;
56 /* 0x0C */ u32 usedMemCount;
57
58};
59
61 template <typename A0>
63 struct Lock {
64 Lock(const A0& param_0) { field_0x0 = OSDisableInterrupts(); }
66
68 };
69 };
70
71
73 // Should be templated on the chunk memory but couldn't initialize it inside the class itself
74 //template <typename A0>
75 struct Lock {
76 Lock(OSMutex* mutex) {
77 mMutex = mutex;
79 }
80
83 }
84
86 };
87 };
88};
89
94template <typename T>
96public:
97 void newMemPool(int param_0) { JASGenericMemPool::newMemPool(sizeof(T), param_0); }
98 void* alloc(u32 n) { return JASGenericMemPool::alloc(n); }
99 void free(void* ptr, u32 n) { JASGenericMemPool::free(ptr, n); }
100};
101
103
108template<u32 ChunkSize, typename T>
110 struct MemoryChunk {
112 mNextChunk = nextChunk;
113 mUsedSize = 0;
114 mChunks = 0;
115 }
116
117 bool checkArea(void* ptr) {
118 return (u8*)this + 0xc <= (u8*)ptr && (u8*)ptr < (u8*)this + (ChunkSize + 0xc);
119 }
120
122 return mNextChunk;
123 }
124
125 void* alloc(u32 size) {
126 u8* rv = mBuffer + mUsedSize;
127 mUsedSize += size;
128 mChunks++;
129 return rv;
130 }
131
132 void free() {
133 mChunks--;
134 }
135
136 bool isEmpty() {
137 return mChunks == 0;
138 }
139
141 mNextChunk = chunk;
142 }
143
145 return ChunkSize - mUsedSize;
146 }
147
148 void revive() {
149 mUsedSize = 0;
150 }
151
155 u8 mBuffer[ChunkSize];
156 };
157public:
160 field_0x18 = NULL;
162 }
163
165 bool uVar2;
166 if (field_0x18 != NULL && field_0x18->isEmpty()) {
168 uVar2 = 1;
169 } else {
170 MemoryChunk* pMVar4 = field_0x18;
172 if (field_0x18 != NULL) {
173 uVar2 = 1;
174 } else {
175 field_0x18 = new (JKRHeap::getSystemHeap(), 0) MemoryChunk(pMVar4);
176 if (field_0x18 != NULL) {
177 uVar2 = 1;
178 } else {
179 field_0x18 = pMVar4;
180 uVar2 = 0;
181 }
182 }
183 }
184 return uVar2;
185 }
186
187 void* alloc(u32 size) {
188 typename T::Lock lock(&mMutex);
189 if (field_0x18->getFreeSize() < size) {
190 if (ChunkSize < size) {
191 return NULL;
192 }
193 if (createNewChunk() == 0) {
194 return NULL;
195 }
196 }
197 return field_0x18->alloc(size);
198 }
199
200 void free(void* ptr) {
201 typename T::Lock lock(&mMutex);
202 MemoryChunk* chunk = field_0x18;
203 MemoryChunk* prevChunk = NULL;
204 while (chunk != NULL) {
205 if (chunk->checkArea(ptr)) {
206 chunk->free();
207 if (chunk != field_0x18 && chunk->isEmpty()) {
208 MemoryChunk* nextChunk = chunk->getNextChunk();
209 delete chunk;
210 prevChunk->setNextChunk(nextChunk);
211 }
212 return;
213 }
214 prevChunk = chunk;
215 chunk = chunk->getNextChunk();
216 }
217 }
218
219 /* 0x00 */ OSMutex mMutex;
221};
222
223namespace JASKernel {
224 /* 802909B8 */ void setupRootHeap(JKRSolidHeap*, u32);
225 /* 80290AC0 */ JKRHeap* getSystemHeap();
227 /* 80290AD0 */ void setupAramHeap(u32, u32);
228 /* 80290B08 */ JASHeap* getAramHeap();
229
230 extern JASHeap audioAramHeap;
231 extern u32 sAramBase;
232 extern JKRHeap* sSystemHeap;
234};
235
240template <typename T>
242public:
243 static void* operator new(size_t n) {
244 JASMemPool<T>* memPool = getMemPool_();
245 return memPool->alloc(sizeof(T));
246 }
247 static void* operator new(size_t n, void* ptr) {
248 return ptr;
249 }
250 static void operator delete(void* ptr, size_t n) {
251 JASMemPool<T>* memPool_ = getMemPool_();
252 memPool_->free(ptr, sizeof(T));
253 }
254 static void newMemPool(int param_0) {
255 JASMemPool<T>* memPool_ = getMemPool_();
256 memPool_->newMemPool(param_0);
257 }
258
259private:
261 static JASMemPool<T> memPool_;
262 return &memPool_;
263 }
264};
265
270template <typename T>
272public:
273 void newMemPool(int param_0) {
275 JASGenericMemPool::newMemPool(sizeof(T), param_0);
276 }
277
278 void* alloc(size_t count) {
280 return JASGenericMemPool::alloc(count);
281 }
282
283 void free(void* ptr, u32 param_1) {
285 JASGenericMemPool::free(ptr, param_1);
286 }
287};
288
293template <typename T>
295public:
296 static void* operator new(size_t n) {
298 return memPool_->alloc(sizeof(T));
299 }
300 static void* operator new(size_t n, void* ptr) {
301 return ptr;
302 }
303 static void operator delete(void* ptr, size_t n) {
305 memPool_->free(ptr, sizeof(T));
306 }
307
308 static void newMemPool(int n) {
309 getMemPool()->newMemPool(n);
310 }
311
312private:
314 static JASMemPool_MultiThreaded<T> memPool_;
315 return &memPool_;
316 }
317};
318
319extern JKRSolidHeap* JASDram;
320
321#endif /* JASHEAPCTRL_H */
JKRSolidHeap * JASDram
Definition JASHeapCtrl.cpp:218
asm BOOL OSRestoreInterrupts(register BOOL level)
Definition OSInterrupt.c:106
asm BOOL OSDisableInterrupts(void)
Definition OSInterrupt.c:85
void OSInitMutex(OSMutex *mutex)
Definition OSMutex.c:52
void OSUnlockMutex(OSMutex *mutex)
Definition OSMutex.c:86
void OSLockMutex(OSMutex *mutex)
Definition OSMutex.c:58
unsigned int size
Definition __os.h:106
Definition JASHeapCtrl.h:17
JASDisposer * mDisposer
Definition JASHeapCtrl.h:36
void initRootHeap(void *, u32)
Definition JASHeapCtrl.cpp:23
bool isAllocated()
Definition JASHeapCtrl.h:31
JASHeap * field_0x40
Definition JASHeapCtrl.h:39
JSUTree< JASHeap > mTree
Definition JASHeapCtrl.h:34
OSMutex mMutex
Definition JASHeapCtrl.h:35
JASHeap * getTailHeap()
Definition JASHeapCtrl.cpp:170
u32 mSize
Definition JASHeapCtrl.h:38
bool allocTail(JASHeap *, u32)
Definition JASHeapCtrl.cpp:90
void insertChild(JASHeap *, JASHeap *, void *, u32, bool)
Definition JASHeapCtrl.cpp:147
JASHeap(JASDisposer *param_0=NULL)
Definition JASHeapCtrl.cpp:14
u32 getSize()
Definition JASHeapCtrl.h:32
bool alloc(JASHeap *, u32)
Definition JASHeapCtrl.cpp:32
bool free()
Definition JASHeapCtrl.cpp:111
u32 getTailOffset()
Definition JASHeapCtrl.cpp:185
u8 * mBase
Definition JASHeapCtrl.h:37
void * getBase()
Definition JASHeapCtrl.h:30
~JASHeap()
Definition JASHeapCtrl.h:28
u32 getCurOffset()
Definition JASHeapCtrl.cpp:193
Definition JASHeapCtrl.h:109
void * alloc(u32 size)
Definition JASHeapCtrl.h:187
JASMemChunkPool()
Definition JASHeapCtrl.h:158
MemoryChunk * field_0x18
Definition JASHeapCtrl.h:220
bool createNewChunk()
Definition JASHeapCtrl.h:164
void free(void *ptr)
Definition JASHeapCtrl.h:200
OSMutex mMutex
Definition JASHeapCtrl.h:219
Definition JASHeapCtrl.h:271
void newMemPool(int param_0)
Definition JASHeapCtrl.h:273
void * alloc(size_t count)
Definition JASHeapCtrl.h:278
void free(void *ptr, u32 param_1)
Definition JASHeapCtrl.h:283
Definition JASHeapCtrl.h:95
void newMemPool(int param_0)
Definition JASHeapCtrl.h:97
void free(void *ptr, u32 n)
Definition JASHeapCtrl.h:99
void * alloc(u32 n)
Definition JASHeapCtrl.h:98
Definition JASHeapCtrl.h:294
static void newMemPool(int n)
Definition JASHeapCtrl.h:308
static JASMemPool_MultiThreaded< T > * getMemPool()
Definition JASHeapCtrl.h:313
Definition JASHeapCtrl.h:241
static void newMemPool(int param_0)
Definition JASHeapCtrl.h:254
static JASMemPool< T > * getMemPool_()
Definition JASHeapCtrl.h:260
Definition JKRHeap.h:16
static JKRHeap * getSystemHeap()
Definition JKRHeap.h:153
Definition JKRSolidHeap.h:10
Definition JSUList.h:186
Definition JASAudioThread.cpp:41
n
Definition e_fmod.c:112
Definition JASHeapCtrl.h:102
void setupAramHeap(u32, u32)
Definition JASHeapCtrl.cpp:289
JASMemChunkPool< 1024, JASThreadingModel::ObjectLevelLockable > * sCommandHeap
Definition JASHeapCtrl.cpp:262
u32 sAramBase
Definition JASHeapCtrl.cpp:256
JKRHeap * getSystemHeap()
Definition JASHeapCtrl.cpp:276
JASHeap audioAramHeap
Definition JASHeapCtrl.cpp:286
JKRHeap * sSystemHeap
Definition JASHeapCtrl.cpp:259
JASMemChunkPool< 1024, JASThreadingModel::ObjectLevelLockable > * getCommandHeap()
Definition JASHeapCtrl.cpp:281
void setupRootHeap(JKRSolidHeap *, u32)
Definition JASHeapCtrl.cpp:266
JASHeap * getAramHeap()
Definition JASHeapCtrl.cpp:295
Definition JASHeapCtrl.h:60
Definition JASWaveArcLoader.h:15
Definition JASHeapCtrl.h:46
~JASGenericMemPool()
Definition JASHeapCtrl.cpp:208
u32 usedMemCount
Definition JASHeapCtrl.h:56
u32 freeMemCount
Definition JASHeapCtrl.h:54
u32 totalMemCount
Definition JASHeapCtrl.h:55
void * field_0x0
Definition JASHeapCtrl.h:53
void newMemPool(u32, int)
Definition JASHeapCtrl.cpp:222
void free(void *, u32)
Definition JASHeapCtrl.cpp:247
JASGenericMemPool()
Definition JASHeapCtrl.cpp:200
void * alloc(u32)
Definition JASHeapCtrl.cpp:233
Definition JASHeapCtrl.h:110
u32 getFreeSize()
Definition JASHeapCtrl.h:144
void revive()
Definition JASHeapCtrl.h:148
u8 mBuffer[ChunkSize]
Definition JASHeapCtrl.h:155
u32 mUsedSize
Definition JASHeapCtrl.h:153
MemoryChunk(MemoryChunk *nextChunk)
Definition JASHeapCtrl.h:111
MemoryChunk * mNextChunk
Definition JASHeapCtrl.h:152
void setNextChunk(MemoryChunk *chunk)
Definition JASHeapCtrl.h:140
u32 mChunks
Definition JASHeapCtrl.h:154
bool isEmpty()
Definition JASHeapCtrl.h:136
void free()
Definition JASHeapCtrl.h:132
void * alloc(u32 size)
Definition JASHeapCtrl.h:125
MemoryChunk * getNextChunk()
Definition JASHeapCtrl.h:121
bool checkArea(void *ptr)
Definition JASHeapCtrl.h:117
~Lock()
Definition JASHeapCtrl.h:65
BOOL field_0x0
Definition JASHeapCtrl.h:67
Lock(const A0 &param_0)
Definition JASHeapCtrl.h:64
Definition JASHeapCtrl.h:62
~Lock()
Definition JASHeapCtrl.h:81
Lock(OSMutex *mutex)
Definition JASHeapCtrl.h:76
OSMutex * mMutex
Definition JASHeapCtrl.h:85
Definition JASHeapCtrl.h:72
Definition OSMutex.h:10
int BOOL
Definition types.h:30
unsigned long u32
Definition types.h:9
unsigned char u8
Definition types.h:5