Skip to content

Commit ff00852

Browse files
Synced heap.c/h structure with pokeheartgold and pokediamond (#865)
1 parent 3b8e295 commit ff00852

File tree

2 files changed

+82
-93
lines changed

2 files changed

+82
-93
lines changed

include/heap.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
#include "constants/heap.h"
77

88
typedef struct HeapParam {
9-
u32 size;
10-
OSArenaId arena;
9+
u32 size; // maximum size of the heap
10+
OSArenaId arena; // where to allocate the heap from
1111
} HeapParam;
1212

1313
void Heap_InitSystem(const HeapParam *templates, u32 nTemplates, u32 totalNumHeaps, u32 preSize);

src/heap.c

Lines changed: 80 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include "error_message_reset.h"
77
#include "unk_020366A0.h"
88

9-
typedef struct {
9+
typedef struct HeapInfo {
1010
NNSFndHeapHandle *heapHandles;
1111
NNSFndHeapHandle *parentHeapHandles;
1212
void **subHeapRawPtrs;
@@ -18,43 +18,49 @@ typedef struct {
1818
u16 unallocatedHeapID;
1919
} HeapInfo;
2020

21-
typedef struct {
22-
char filler_00[12];
21+
typedef struct MemoryBlock {
22+
u8 filler_00[12];
2323
u32 heapID : 8;
2424
u32 filler_0D : 24;
2525
} MemoryBlock;
2626

27-
static int FindFirstAvailableHeapHandle(void);
28-
static BOOL CreateHeapInternal(enum HeapID parent, enum HeapID child, u32 size, s32 alignment);
29-
static void *AllocFromHeapInternal(NNSFndHeapHandle heap, u32 size, s32 alignment, u32 heapID);
27+
static HeapInfo sHeapInfo;
3028

31-
static HeapInfo sHeapInfo = { 0 };
29+
static BOOL CreateHeapInternal(enum HeapID parent, enum HeapID child, u32 size, s32 alignment);
3230

3331
void Heap_InitSystem(const HeapParam *templates, u32 nTemplates, u32 totalNumHeaps, u32 preSize)
3432
{
3533
void *ptr;
3634
u32 i;
3735
u32 usableHeaps = nTemplates + 24;
36+
3837
if (totalNumHeaps < usableHeaps) {
3938
totalNumHeaps = usableHeaps;
4039
}
4140

42-
if (preSize) {
43-
while (preSize & 3) {
41+
if (preSize != 0) {
42+
// force align
43+
while (preSize % 4 != 0) {
4444
preSize++;
4545
}
4646
OS_AllocFromMainArenaLo(preSize, 4);
4747
}
4848

49-
sHeapInfo.heapHandles = OS_AllocFromMainArenaLo((sizeof(NNSFndHeapHandle) * (usableHeaps + 1)) + (sizeof(NNSFndHeapHandle) * usableHeaps) + (sizeof(void *) * usableHeaps) + (sizeof(u16) * (totalNumHeaps)) + totalNumHeaps, 4);
49+
sHeapInfo.heapHandles = OS_AllocFromMainArenaLo(
50+
(usableHeaps + 1) * sizeof(NNSFndHeapHandle)
51+
+ usableHeaps * sizeof(NNSFndHeapHandle)
52+
+ usableHeaps * sizeof(void *)
53+
+ totalNumHeaps * sizeof(u16)
54+
+ totalNumHeaps,
55+
4);
5056
sHeapInfo.parentHeapHandles = sHeapInfo.heapHandles + (usableHeaps + 1);
51-
sHeapInfo.subHeapRawPtrs = (void **)((u8 *)(sHeapInfo.parentHeapHandles) + (sizeof(NNSFndHeapHandle) * usableHeaps));
52-
sHeapInfo.numMemBlocks = (u16 *)((u8 *)(sHeapInfo.subHeapRawPtrs) + (sizeof(void *) * usableHeaps));
53-
sHeapInfo.heapIdxs = (u8 *)(sHeapInfo.numMemBlocks) + (sizeof(u16) * (totalNumHeaps));
54-
sHeapInfo.totalNumHeaps = totalNumHeaps;
55-
sHeapInfo.nTemplates = nTemplates;
56-
sHeapInfo.unallocatedHeapID = usableHeaps;
57-
sHeapInfo.maxHeaps = usableHeaps;
57+
sHeapInfo.subHeapRawPtrs = (void **)(sHeapInfo.parentHeapHandles + usableHeaps);
58+
sHeapInfo.numMemBlocks = (u16 *)(sHeapInfo.subHeapRawPtrs + usableHeaps);
59+
sHeapInfo.heapIdxs = (u8 *)(sHeapInfo.numMemBlocks + totalNumHeaps);
60+
sHeapInfo.totalNumHeaps = (u16)totalNumHeaps;
61+
sHeapInfo.nTemplates = (u16)nTemplates;
62+
sHeapInfo.unallocatedHeapID = (u16)usableHeaps;
63+
sHeapInfo.maxHeaps = (u16)usableHeaps;
5864

5965
for (i = 0; i < nTemplates; i++) {
6066
switch (templates[i].arena) {
@@ -69,29 +75,31 @@ void Heap_InitSystem(const HeapParam *templates, u32 nTemplates, u32 totalNumHea
6975

7076
if (ptr != NULL) {
7177
sHeapInfo.heapHandles[i] = NNS_FndCreateExpHeap(ptr, templates[i].size);
72-
sHeapInfo.heapIdxs[i] = i;
78+
sHeapInfo.heapIdxs[i] = (u8)i;
7379
} else {
7480
GF_ASSERT(FALSE);
7581
}
7682
}
7783

78-
for (i = nTemplates; i < (usableHeaps + 1); i++) {
84+
for (i = nTemplates; i < usableHeaps + 1; i++) {
7985
sHeapInfo.heapHandles[i] = NNS_FND_HEAP_INVALID_HANDLE;
80-
sHeapInfo.heapIdxs[i] = sHeapInfo.unallocatedHeapID;
86+
sHeapInfo.heapIdxs[i] = (u8)sHeapInfo.unallocatedHeapID;
8187
}
8288

8389
while (i < totalNumHeaps) {
84-
sHeapInfo.heapIdxs[i++] = sHeapInfo.unallocatedHeapID;
90+
sHeapInfo.heapIdxs[i++] = (u8)sHeapInfo.unallocatedHeapID;
8591
}
8692

8793
for (i = 0; i < totalNumHeaps; i++) {
8894
sHeapInfo.numMemBlocks[i] = 0;
8995
}
9096
}
9197

92-
static int FindFirstAvailableHeapHandle(void)
98+
static s32 FindFirstAvailableHeapHandle(void)
9399
{
94-
for (int i = sHeapInfo.nTemplates; i < sHeapInfo.maxHeaps; i++) {
100+
s32 i;
101+
102+
for (i = sHeapInfo.nTemplates; i < sHeapInfo.maxHeaps; i++) {
95103
if (sHeapInfo.heapHandles[i] == NNS_FND_HEAP_INVALID_HANDLE) {
96104
return i;
97105
}
@@ -114,22 +122,20 @@ static BOOL CreateHeapInternal(enum HeapID parent, enum HeapID child, u32 size,
114122
{
115123
GF_ASSERT(OS_GetProcMode() != OS_PROCMODE_IRQ);
116124

117-
if (sHeapInfo.heapIdxs[child] == sHeapInfo.unallocatedHeapID) {
118-
NNSFndHeapHandle parentHeap = sHeapInfo.heapHandles[sHeapInfo.heapIdxs[parent]];
119-
125+
u8 *ptr = sHeapInfo.heapIdxs;
126+
if (sHeapInfo.unallocatedHeapID == ptr[child]) {
127+
NNSFndHeapHandle parentHeap = sHeapInfo.heapHandles[ptr[parent]];
120128
if (parentHeap != NNS_FND_HEAP_INVALID_HANDLE) {
121129
void *newHeapAddr = NNS_FndAllocFromExpHeapEx(parentHeap, size, alignment);
122-
123130
if (newHeapAddr != NULL) {
124-
int i = FindFirstAvailableHeapHandle();
125-
131+
s32 i = FindFirstAvailableHeapHandle();
126132
if (i >= 0) {
127133
sHeapInfo.heapHandles[i] = NNS_FndCreateExpHeap(newHeapAddr, size);
128134

129135
if (sHeapInfo.heapHandles[i] != NNS_FND_HEAP_INVALID_HANDLE) {
130136
sHeapInfo.parentHeapHandles[i] = parentHeap;
131137
sHeapInfo.subHeapRawPtrs[i] = newHeapAddr;
132-
sHeapInfo.heapIdxs[child] = i;
138+
sHeapInfo.heapIdxs[child] = (u8)i;
133139

134140
return TRUE;
135141
} else {
@@ -147,54 +153,47 @@ static BOOL CreateHeapInternal(enum HeapID parent, enum HeapID child, u32 size,
147153
} else {
148154
GF_ASSERT(FALSE);
149155
}
150-
151156
return FALSE;
152157
}
153158

154159
void Heap_Destroy(enum HeapID heapID)
155160
{
156161
GF_ASSERT(OS_GetProcMode() != OS_PROCMODE_IRQ);
157162

158-
u8 index = sHeapInfo.heapIdxs[heapID];
159-
NNSFndHeapHandle handle = sHeapInfo.heapHandles[index];
163+
NNSFndHeapHandle handle = sHeapInfo.heapHandles[sHeapInfo.heapIdxs[heapID]];
160164

161165
if (handle != NNS_FND_HEAP_INVALID_HANDLE) {
162-
NNSFndHeapHandle parentHeap;
163-
void *childRaw;
164-
165166
NNS_FndDestroyExpHeap(handle);
166167

167-
parentHeap = sHeapInfo.parentHeapHandles[sHeapInfo.heapIdxs[heapID]];
168-
childRaw = sHeapInfo.subHeapRawPtrs[sHeapInfo.heapIdxs[heapID]];
169-
170-
if ((parentHeap != NNS_FND_HEAP_INVALID_HANDLE) && (childRaw != NULL)) {
168+
u8 index = sHeapInfo.heapIdxs[heapID];
169+
NNSFndHeapHandle parentHeap = sHeapInfo.parentHeapHandles[index];
170+
void *childRaw = sHeapInfo.subHeapRawPtrs[index];
171+
if (parentHeap != NNS_FND_HEAP_INVALID_HANDLE && childRaw != NULL) {
171172
NNS_FndFreeToExpHeap(parentHeap, childRaw);
172173
} else {
173174
GF_ASSERT(FALSE);
174175
}
175176

176-
sHeapInfo.heapHandles[sHeapInfo.heapIdxs[heapID]] = (void *)0;
177-
sHeapInfo.parentHeapHandles[sHeapInfo.heapIdxs[heapID]] = (void *)0;
178-
sHeapInfo.subHeapRawPtrs[sHeapInfo.heapIdxs[heapID]] = (void *)0;
177+
sHeapInfo.heapHandles[sHeapInfo.heapIdxs[heapID]] = NULL;
178+
sHeapInfo.parentHeapHandles[sHeapInfo.heapIdxs[heapID]] = NULL;
179+
sHeapInfo.subHeapRawPtrs[sHeapInfo.heapIdxs[heapID]] = NULL;
179180

180-
sHeapInfo.heapIdxs[heapID] = sHeapInfo.unallocatedHeapID;
181+
sHeapInfo.heapIdxs[heapID] = (u8)sHeapInfo.unallocatedHeapID;
181182
}
182183
}
183184

184-
static void *AllocFromHeapInternal(NNSFndHeapHandle heap, u32 size, s32 alignment, u32 heapID)
185+
static void *AllocFromHeapInternal(NNSFndHeapHandle heap, u32 size, s32 alignment, enum HeapID heapID)
185186
{
186-
void *ptr;
187-
OSIntrMode intr_mode;
188-
189187
GF_ASSERT(heap != NNS_FND_HEAP_INVALID_HANDLE);
190188

191-
intr_mode = OS_DisableInterrupts();
192-
ptr = NNS_FndAllocFromExpHeapEx(heap, size + sizeof(MemoryBlock), alignment);
193-
194-
OS_RestoreInterrupts(intr_mode);
189+
OSIntrMode intrMode = OS_DisableInterrupts();
190+
size += sizeof(MemoryBlock);
191+
void *ptr = NNS_FndAllocFromExpHeapEx(heap, size, alignment);
195192

193+
OS_RestoreInterrupts(intrMode);
196194
if (ptr != NULL) {
197195
((MemoryBlock *)ptr)->heapID = heapID;
196+
198197
ptr += sizeof(MemoryBlock);
199198
}
200199

@@ -212,10 +211,9 @@ void *Heap_Alloc(u32 heapID, u32 size)
212211
{
213212
void *ptr = NULL;
214213

215-
if (heapID < sHeapInfo.totalNumHeaps) {
214+
if ((u32)heapID < sHeapInfo.totalNumHeaps) {
216215
u8 index = sHeapInfo.heapIdxs[heapID];
217-
NNSFndHeapHandle heap = sHeapInfo.heapHandles[index];
218-
ptr = AllocFromHeapInternal(heap, size, 4, heapID);
216+
ptr = AllocFromHeapInternal(sHeapInfo.heapHandles[index], size, 4, heapID);
219217
}
220218

221219
if (ptr != NULL) {
@@ -231,10 +229,9 @@ void *Heap_AllocAtEnd(u32 heapID, u32 size)
231229
{
232230
void *ptr = NULL;
233231

234-
if (heapID < sHeapInfo.totalNumHeaps) {
232+
if ((u32)heapID < sHeapInfo.totalNumHeaps) {
235233
u8 index = sHeapInfo.heapIdxs[heapID];
236-
NNSFndHeapHandle heap = sHeapInfo.heapHandles[index];
237-
ptr = AllocFromHeapInternal(heap, size, -4, heapID);
234+
ptr = AllocFromHeapInternal(sHeapInfo.heapHandles[index], size, -4, heapID);
238235
}
239236

240237
if (ptr != NULL) {
@@ -249,9 +246,9 @@ void *Heap_AllocAtEnd(u32 heapID, u32 size)
249246
void Heap_Free(void *ptr)
250247
{
251248
ptr -= sizeof(MemoryBlock);
252-
u32 heapID = ((MemoryBlock *)ptr)->heapID;
249+
enum HeapID heapID = (enum HeapID)((MemoryBlock *)ptr)->heapID;
253250

254-
if (heapID < sHeapInfo.totalNumHeaps) {
251+
if ((u32)heapID < sHeapInfo.totalNumHeaps) {
255252
u8 index = sHeapInfo.heapIdxs[heapID];
256253
NNSFndHeapHandle heap = sHeapInfo.heapHandles[index];
257254

@@ -261,53 +258,46 @@ void Heap_Free(void *ptr)
261258
GF_heap_c_dummy_return_true(heapID);
262259
}
263260

264-
GF_ASSERT(sHeapInfo.numMemBlocks[heapID]);
261+
GF_ASSERT(sHeapInfo.numMemBlocks[heapID] != 0);
265262

266263
sHeapInfo.numMemBlocks[heapID]--;
267264

268-
{
269-
OSIntrMode intrMode;
270-
271-
intrMode = OS_DisableInterrupts();
272-
NNS_FndFreeToExpHeap(heap, ptr);
273-
OS_RestoreInterrupts(intrMode);
274-
}
275-
} else {
276-
GF_ASSERT(FALSE);
265+
OSIntrMode intrMode = OS_DisableInterrupts();
266+
NNS_FndFreeToExpHeap(heap, ptr);
267+
OS_RestoreInterrupts(intrMode);
268+
return;
277269
}
270+
271+
GF_ASSERT(FALSE);
278272
}
279273

280274
void Heap_FreeExplicit(u32 heapID, void *ptr)
281275
{
282276
GF_ASSERT(OS_GetProcMode() != OS_PROCMODE_IRQ);
283277

284-
if (heapID < sHeapInfo.totalNumHeaps) {
278+
if ((u32)heapID < sHeapInfo.totalNumHeaps) {
285279
u8 index = sHeapInfo.heapIdxs[heapID];
286280
NNSFndHeapHandle heap = sHeapInfo.heapHandles[index];
287281

288282
GF_ASSERT(heap != NNS_FND_HEAP_INVALID_HANDLE);
289283

290284
ptr -= sizeof(MemoryBlock);
291-
292-
if (((MemoryBlock *)ptr)->heapID != heapID) {
293-
GF_ASSERT(FALSE);
294-
}
285+
GF_ASSERT(((MemoryBlock *)ptr)->heapID == heapID);
295286

296287
NNS_FndFreeToExpHeap(heap, ptr);
297-
298-
GF_ASSERT(sHeapInfo.numMemBlocks[heapID]);
288+
GF_ASSERT(sHeapInfo.numMemBlocks[heapID] != 0);
299289
sHeapInfo.numMemBlocks[heapID]--;
300-
} else {
301-
GF_ASSERT(FALSE);
290+
return;
302291
}
292+
293+
GF_ASSERT(FALSE);
303294
}
304295

305296
u32 HeapExp_FndGetTotalFreeSize(u32 heapID)
306297
{
307-
if (heapID < sHeapInfo.totalNumHeaps) {
298+
if ((u32)heapID < sHeapInfo.totalNumHeaps) {
308299
u8 index = sHeapInfo.heapIdxs[heapID];
309-
NNSFndHeapHandle heap = sHeapInfo.heapHandles[index];
310-
return NNS_FndGetTotalFreeSizeForExpHeap(heap);
300+
return NNS_FndGetTotalFreeSizeForExpHeap(sHeapInfo.heapHandles[index]);
311301
}
312302

313303
GF_ASSERT(FALSE);
@@ -316,13 +306,13 @@ u32 HeapExp_FndGetTotalFreeSize(u32 heapID)
316306

317307
void HeapExp_FndInitAllocator(NNSFndAllocator *pAllocator, u32 heapID, int alignment)
318308
{
319-
if (heapID < sHeapInfo.totalNumHeaps) {
309+
if ((u32)heapID < sHeapInfo.totalNumHeaps) {
320310
u8 index = sHeapInfo.heapIdxs[heapID];
321-
NNSFndHeapHandle heap = sHeapInfo.heapHandles[index];
322-
NNS_FndInitAllocatorForExpHeap(pAllocator, heap, alignment);
323-
} else {
324-
GF_ASSERT(FALSE);
311+
NNS_FndInitAllocatorForExpHeap(pAllocator, sHeapInfo.heapHandles[index], alignment);
312+
return;
325313
}
314+
315+
GF_ASSERT(FALSE);
326316
}
327317

328318
void Heap_Realloc(void *ptr, u32 newSize)
@@ -335,12 +325,11 @@ void Heap_Realloc(void *ptr, u32 newSize)
335325
if (NNS_FndGetSizeForMBlockExpHeap(ptr) >= newSize) {
336326
u32 heapID = ((MemoryBlock *)ptr)->heapID;
337327
u8 index = sHeapInfo.heapIdxs[heapID];
338-
NNSFndHeapHandle heap = sHeapInfo.heapHandles[index];
339328

340-
NNS_FndResizeForMBlockExpHeap(heap, ptr, newSize);
341-
} else {
342-
GF_ASSERT(FALSE);
329+
NNS_FndResizeForMBlockExpHeap(sHeapInfo.heapHandles[index], ptr, newSize);
330+
return;
343331
}
332+
GF_ASSERT(FALSE);
344333
}
345334

346335
BOOL GF_heap_c_dummy_return_true(u32 heapID)

0 commit comments

Comments
 (0)