Twilight Princess
Decompilation of The Legend of Zelda: Twilight Princess
Loading...
Searching...
No Matches
JASHeapCtrl.h
Go to the documentation of this file.
1#ifndef JASHEAPCTRL_H
2#define JASHEAPCTRL_H
3
7#include <dolphin/os.h>
8#include <dolphin/os.h>
9
10class JASDisposer;
11class JKRHeap;
12class JKRSolidHeap;
13
18class JASHeap {
19public:
20 JASHeap(JASDisposer* param_0 = NULL);
21 void initRootHeap(void*, u32);
22 bool alloc(JASHeap*, u32);
23 bool allocTail(JASHeap*, u32);
24 bool free();
25 void insertChild(JASHeap*, JASHeap*, void*, u32, bool);
29
30 void* getBase() { return mBase; }
31 bool isAllocated() { return mBase; }
32 u32 getSize() const { return mSize; }
33
35 /* 0x1C */ OSMutex mMutex;
37 /* 0x38 */ u8* mBase;
38 /* 0x3C */ u32 mSize;
39 /* 0x40 */ JASHeap* field_0x40;
40};
41
49 void newMemPool(u32, int);
50 void* alloc(u32);
51 void free(void*, u32);
52
54 return freeMemCount;
55 }
56
58 return totalMemCount;
59 }
60
61 /* 0x00 */ void* field_0x0;
62 /* 0x04 */ u32 freeMemCount;
63 /* 0x08 */ u32 totalMemCount;
64 /* 0x0C */ u32 usedMemCount;
65};
66
68 template <typename A0>
70 struct Lock {
71 Lock(const A0& param_0) { field_0x0 = OSDisableInterrupts(); }
73
75 };
76 };
77
78 template <typename A0>
79 struct ObjectLevelLockable : public OSMutex {
81 OSInitMutex(this);
82 }
83
84 struct Lock {
85 Lock(A0 const& mutex) {
86 mMutex = (A0*)&mutex;
88 }
89
92 }
93
94 A0* mMutex;
95 };
96 };
97
98 template <typename A0>
100 struct Lock {
101 Lock(const A0& param_0) {}
102 };
103 };
104}; // namespace JASThreadingModel
105
110template <typename T>
112public:
113 void newMemPool(int param_0) {
115 JASGenericMemPool::newMemPool(sizeof(T), param_0);
116 }
117
118 void* alloc(u32 n) {
119 JUT_ASSERT(182, n == sizeof(T));
122 }
123
124 void free(void* ptr, u32 n) {
125 JUT_ASSERT(187, n == sizeof(T));
128 }
129
134
139};
140
142
147template<u32 ChunkSize, template<typename> class T>
148class JASMemChunkPool : public T<JASMemChunkPool<ChunkSize, T> >::ObjectLevelLockable {
149 struct MemoryChunk {
151 mNextChunk = nextChunk;
152 mUsedSize = 0;
153 mChunks = 0;
154 }
155
156 bool checkArea(const void* ptr) const {
157 return (u8*)this + 0xc <= (u8*)ptr && (u8*)ptr < (u8*)this + (ChunkSize + 0xc);
158 }
159
161 return mNextChunk;
162 }
163
164 void* alloc(u32 size) {
165 u8* rv = mBuffer + mUsedSize;
166 mUsedSize += size;
167 mChunks++;
168 return rv;
169 }
170
171 void free(void* mem) {
172 mChunks--;
173 }
174
175 bool isEmpty() const {
176 return mChunks == 0;
177 }
178
180 mNextChunk = chunk;
181 }
182
184 return ChunkSize - mUsedSize;
185 }
186
187 void revive() {
188 mUsedSize = 0;
189 }
190
194 u8 mBuffer[ChunkSize];
195 };
196public:
198 field_0x18 = NULL;
199 bool ret = createNewChunk();
200 JUT_ASSERT(320, ret);
201 }
202
204 bool uVar2;
205 if (field_0x18 != NULL && field_0x18->isEmpty()) {
207 uVar2 = 1;
208 } else {
209 MemoryChunk* pMVar4 = field_0x18;
211 if (field_0x18 != NULL) {
212 uVar2 = 1;
213 } else {
214 JUT_WARN(428, "%s", "Not enough JASSystemHeap");
215 field_0x18 = new (JKRHeap::getSystemHeap(), 0) MemoryChunk(pMVar4);
216 if (field_0x18 != NULL) {
217 uVar2 = 1;
218 } else {
219 field_0x18 = pMVar4;
220 uVar2 = 0;
221 }
222 }
223 }
224 return uVar2;
225 }
226
227 void* alloc(u32 size) {
228 typename T<JASMemChunkPool<ChunkSize, T> >::Lock lock(*this);
229 u32 freeSize = field_0x18->getFreeSize();
230 if (freeSize < size) {
231 if (ChunkSize < size) {
232 return NULL;
233 }
234 if (createNewChunk() == 0) {
235 return NULL;
236 }
237 }
238 return field_0x18->alloc(size);
239 }
240
241 void free(void* ptr) {
242 typename T<JASMemChunkPool<ChunkSize, T> >::Lock lock(*this);
243 MemoryChunk* chunk = field_0x18;
244 MemoryChunk* prevChunk = NULL;
245 while (chunk != NULL) {
246 if (chunk->checkArea(ptr)) {
247 chunk->free(ptr);
248
249 if (chunk != field_0x18 && chunk->isEmpty()) {
250 MemoryChunk* nextChunk = chunk->getNextChunk();
251 delete chunk;
252 prevChunk->setNextChunk(nextChunk);
253 }
254 return;
255 }
256 prevChunk = chunk;
257 chunk = chunk->getNextChunk();
258 }
259
260 JUT_PANIC(362, "Cannnot free for JASMemChunkPool");
261 }
262
264};
265
266namespace JASKernel {
270 void setupAramHeap(u32, u32);
272
273 extern JASHeap audioAramHeap;
274 extern u32 sAramBase;
275 extern JKRHeap* sSystemHeap;
277};
278
283template <typename T>
285public:
286 static void* operator new(size_t n) {
288 return memPool_.alloc(n);
289 }
290 static void* operator new(size_t n, void* ptr) {
291 return ptr;
292 }
293 static void operator delete(void* ptr, size_t n) {
295 memPool_.free(ptr, n);
296 }
297 static void newMemPool(int param_0) {
299 memPool_.newMemPool(param_0);
300 }
303 return memPool_.getFreeMemCount();
304 }
307 return memPool_.getTotalMemCount();
308 }
309
310private:
311 // Fakematch? Is memPool_ both an in-function static and an out-of-function static?
314 static JASMemPool<T> memPool_;
315 return memPool_;
316 }
317};
318
323template <typename T>
325public:
326 void newMemPool(int param_0) {
328 JASGenericMemPool::newMemPool(sizeof(T), param_0);
329 }
330
331 void* alloc(size_t count) {
333 return JASGenericMemPool::alloc(count);
334 }
335
336 void free(void* ptr, u32 param_1) {
338 JASGenericMemPool::free(ptr, param_1);
339 }
340};
341
346template <typename T>
348public:
349 static void* operator new(size_t n) {
351 return memPool_.alloc(sizeof(T));
352 }
353 static void* operator new(size_t n, void* ptr) {
354 return ptr;
355 }
356 static void operator delete(void* ptr, size_t n) {
358 memPool_.free(ptr, sizeof(T));
359 }
360
361 static void newMemPool(int n) {
363 memPool_.newMemPool(n);
364 }
365
366private:
367 // Fakematch? Is memPool_ both an in-function static and an out-of-function static?
373};
374
375extern JKRSolidHeap* JASDram;
376
377#endif /* JASHEAPCTRL_H */
JKRSolidHeap * JASDram
Definition JASHeapCtrl.cpp:196
Definition JASHeapCtrl.h:18
JASDisposer * mDisposer
Definition JASHeapCtrl.h:36
void initRootHeap(void *, u32)
Definition JASHeapCtrl.cpp:18
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:153
u32 mSize
Definition JASHeapCtrl.h:38
bool allocTail(JASHeap *, u32)
Definition JASHeapCtrl.cpp:79
void insertChild(JASHeap *, JASHeap *, void *, u32, bool)
Definition JASHeapCtrl.cpp:131
JASHeap(JASDisposer *param_0=NULL)
Definition JASHeapCtrl.cpp:10
bool alloc(JASHeap *, u32)
Definition JASHeapCtrl.cpp:26
bool free()
Definition JASHeapCtrl.cpp:98
u32 getTailOffset()
Definition JASHeapCtrl.cpp:167
u8 * mBase
Definition JASHeapCtrl.h:37
void * getBase()
Definition JASHeapCtrl.h:30
u32 getSize() const
Definition JASHeapCtrl.h:32
u32 getCurOffset()
Definition JASHeapCtrl.cpp:174
Definition JASHeapCtrl.h:148
void * alloc(u32 size)
Definition JASHeapCtrl.h:227
JASMemChunkPool()
Definition JASHeapCtrl.h:197
MemoryChunk * field_0x18
Definition JASHeapCtrl.h:263
bool createNewChunk()
Definition JASHeapCtrl.h:203
void free(void *ptr)
Definition JASHeapCtrl.h:241
Definition JASHeapCtrl.h:324
void newMemPool(int param_0)
Definition JASHeapCtrl.h:326
void * alloc(size_t count)
Definition JASHeapCtrl.h:331
void free(void *ptr, u32 param_1)
Definition JASHeapCtrl.h:336
Definition JASHeapCtrl.h:111
u32 getTotalMemCount() const
Definition JASHeapCtrl.h:135
void newMemPool(int param_0)
Definition JASHeapCtrl.h:113
void free(void *ptr, u32 n)
Definition JASHeapCtrl.h:124
void * alloc(u32 n)
Definition JASHeapCtrl.h:118
u32 getFreeMemCount() const
Definition JASHeapCtrl.h:130
Definition JASHeapCtrl.h:347
static void newMemPool(int n)
Definition JASHeapCtrl.h:361
static JASMemPool_MultiThreaded< T > & getMemPool()
Definition JASHeapCtrl.h:369
static JASMemPool_MultiThreaded< T > memPool_
Definition JASHeapCtrl.h:368
Definition JASHeapCtrl.h:284
static void newMemPool(int param_0)
Definition JASHeapCtrl.h:297
static u32 getTotalMemCount()
Definition JASHeapCtrl.h:305
static JASMemPool< T > memPool_
Definition JASHeapCtrl.h:312
static u32 getFreeMemCount()
Definition JASHeapCtrl.h:301
static JASMemPool< T > & getMemPool_()
Definition JASHeapCtrl.h:313
Definition JKRHeap.h:20
static JKRHeap * getSystemHeap()
Definition JKRHeap.h:157
Definition JKRSolidHeap.h:10
Definition JSUList.h:186
Definition JASAudioThread.cpp:34
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
int BOOL
Definition types.h:33
unsigned long u32
Definition types.h:12
unsigned char u8
Definition types.h:8
n
Definition e_fmod.c:112
Definition JASHeapCtrl.h:141
void setupAramHeap(u32, u32)
Definition JASHeapCtrl.cpp:262
JASMemChunkPool< 1024, JASThreadingModel::ObjectLevelLockable > * sCommandHeap
Definition JASHeapCtrl.cpp:241
u32 sAramBase
Definition JASHeapCtrl.cpp:237
JKRHeap * getSystemHeap()
Definition JASHeapCtrl.cpp:252
JASHeap audioAramHeap
Definition JASHeapCtrl.cpp:260
JKRHeap * sSystemHeap
Definition JASHeapCtrl.cpp:239
JASMemChunkPool< 1024, JASThreadingModel::ObjectLevelLockable > * getCommandHeap()
Definition JASHeapCtrl.cpp:256
void setupRootHeap(JKRSolidHeap *, u32)
Definition JASHeapCtrl.cpp:243
JASHeap * getAramHeap()
Definition JASHeapCtrl.cpp:267
Definition JASHeapCtrl.h:67
Definition JASWaveArcLoader.h:14
Definition JASHeapCtrl.h:46
~JASGenericMemPool()
Definition JASHeapCtrl.cpp:187
u32 usedMemCount
Definition JASHeapCtrl.h:64
u32 getFreeMemCount() const
Definition JASHeapCtrl.h:53
u32 freeMemCount
Definition JASHeapCtrl.h:62
u32 totalMemCount
Definition JASHeapCtrl.h:63
void * field_0x0
Definition JASHeapCtrl.h:61
void newMemPool(u32, int)
Definition JASHeapCtrl.cpp:203
u32 getTotalMemCount() const
Definition JASHeapCtrl.h:57
void free(void *, u32)
Definition JASHeapCtrl.cpp:229
JASGenericMemPool()
Definition JASHeapCtrl.cpp:180
void * alloc(u32)
Definition JASHeapCtrl.cpp:216
Definition JASHeapCtrl.h:149
u32 getFreeSize()
Definition JASHeapCtrl.h:183
void free(void *mem)
Definition JASHeapCtrl.h:171
bool checkArea(const void *ptr) const
Definition JASHeapCtrl.h:156
void revive()
Definition JASHeapCtrl.h:187
u8 mBuffer[ChunkSize]
Definition JASHeapCtrl.h:194
u32 mUsedSize
Definition JASHeapCtrl.h:192
MemoryChunk(MemoryChunk *nextChunk)
Definition JASHeapCtrl.h:150
MemoryChunk * mNextChunk
Definition JASHeapCtrl.h:191
void setNextChunk(MemoryChunk *chunk)
Definition JASHeapCtrl.h:179
u32 mChunks
Definition JASHeapCtrl.h:193
bool isEmpty() const
Definition JASHeapCtrl.h:175
void * alloc(u32 size)
Definition JASHeapCtrl.h:164
MemoryChunk * getNextChunk()
Definition JASHeapCtrl.h:160
~Lock()
Definition JASHeapCtrl.h:72
BOOL field_0x0
Definition JASHeapCtrl.h:74
Lock(const A0 &param_0)
Definition JASHeapCtrl.h:71
Definition JASHeapCtrl.h:69
A0 * mMutex
Definition JASHeapCtrl.h:94
Lock(A0 const &mutex)
Definition JASHeapCtrl.h:85
~Lock()
Definition JASHeapCtrl.h:90
Definition JASHeapCtrl.h:79
ObjectLevelLockable()
Definition JASHeapCtrl.h:80
Definition JASHeapCtrl.h:100
Lock(const A0 &param_0)
Definition JASHeapCtrl.h:101
Definition JASHeapCtrl.h:99
Definition OSMutex.h:13