From 2e6a113eb27577764b1b6de22e04ae1f73d3069f Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 30 May 2021 09:19:03 -0400 Subject: Refactor heap.c, 2 --- arm9/lib/include/NNS_FND_allocator.h | 34 ++++++++++++++++++++++ arm9/lib/include/NNS_FND_expheap.h | 54 ++++++++++++++++++++++++++++++----- arm9/lib/include/NNS_FND_heapcommon.h | 2 ++ 3 files changed, 83 insertions(+), 7 deletions(-) create mode 100644 arm9/lib/include/NNS_FND_allocator.h (limited to 'arm9/lib') diff --git a/arm9/lib/include/NNS_FND_allocator.h b/arm9/lib/include/NNS_FND_allocator.h new file mode 100644 index 00000000..48df282a --- /dev/null +++ b/arm9/lib/include/NNS_FND_allocator.h @@ -0,0 +1,34 @@ +#ifndef GUARD_NNS_FND_ALLOCATOR_H +#define GUARD_NNS_FND_ALLOCATOR_H + +#include "NNS_FND_heapcommon.h" + +typedef struct NNSFndAllocator NNSFndAllocator; + +typedef void* (*NNSFndFuncAllocatorAlloc)( + NNSFndAllocator* pAllocator, + u32 size); + +typedef void (*NNSFndFuncAllocatorFree)( + NNSFndAllocator* pAllocator, + void* memBlock); + +typedef struct NNSFndAllocatorFunc NNSFndAllocatorFunc; + +struct NNSFndAllocatorFunc +{ + NNSFndFuncAllocatorAlloc pfAlloc; + NNSFndFuncAllocatorFree pfFree; +}; + +struct NNSFndAllocator +{ + NNSFndAllocatorFunc const * pFunc; + void* pHeap; + u32 heapParam1; + u32 heapParam2; +}; + +void NNS_FndInitAllocatorForExpHeap(NNSFndAllocator * pAllocator, NNSFndHeapHandle heap, int alignment); + +#endif //GUARD_NNS_FND_ALLOCATOR_H diff --git a/arm9/lib/include/NNS_FND_expheap.h b/arm9/lib/include/NNS_FND_expheap.h index 171cacf6..c0008f28 100644 --- a/arm9/lib/include/NNS_FND_expheap.h +++ b/arm9/lib/include/NNS_FND_expheap.h @@ -3,13 +3,53 @@ #include "NNS_FND_heapcommon.h" +typedef struct NNSiFndExpHeapMBlockHead NNSiFndExpHeapMBlockHead; + +struct NNSiFndExpHeapMBlockHead +{ + u16 signature; // Signature + u16 attribute; // Attribute + // [8:groupID] + // [7:alignment] + // [1:temporary flag] + + u32 blockSize; // Block size (data area only) + + NNSiFndExpHeapMBlockHead* pMBHeadPrev; // Previous block + NNSiFndExpHeapMBlockHead* pMBHeadNext; // Next block +}; + +typedef struct NNSiFndExpMBlockList NNSiFndExpMBlockList; + +struct NNSiFndExpMBlockList +{ + NNSiFndExpHeapMBlockHead* head; // Pointer for memory block linked to header + NNSiFndExpHeapMBlockHead* tail; // Pointer to the memory block linked to the tail of the expanded heap +}; + +typedef struct NNSiFndExpHeapHead NNSiFndExpHeapHead; + +struct NNSiFndExpHeapHead +{ + NNSiFndExpMBlockList mbFreeList; // Free list + NNSiFndExpMBlockList mbUsedList; // Used list + + u16 groupID; // Current group ID (lower 8 bits only) + u16 feature; // Attribute +}; + NNSFndHeapHandle NNS_FndCreateExpHeapEx(void *startAddress, u32 size, u32 optFlag); -void *NNS_FndAllocFromExpHeapEx(void *param0, u32 param1, s32 param2); -void NNS_FndDestroyExpHeap(); -void NNS_FndFreeToExpHeap(void *ptr1, void *ptr2); -u32 NNS_FndGetTotalFreeSizeForExpHeap(void *param0); -void NNS_FndInitAllocatorForExpHeap(u32 param0, void *param1, u32 param2); -u32 NNS_FndGetSizeForMBlockExpHeap(void *param0); -void NNS_FndResizeForMBlockExpHeap(void *ptr1, void *ptr2, u32 param2); +void *NNS_FndAllocFromExpHeapEx(NNSFndHeapHandle heap, u32 size, int alignment); +void NNS_FndDestroyExpHeap(NNSFndHeapHandle heap); +void NNS_FndFreeToExpHeap(NNSFndHeapHandle heap, void *memBlock); +u32 NNS_FndGetTotalFreeSizeForExpHeap(NNSFndHeapHandle heap); +u32 NNS_FndGetSizeForMBlockExpHeap(const void *memBlock); +void NNS_FndResizeForMBlockExpHeap(NNSFndHeapHandle heap, void *memBlock, u32 size); + +#define NNS_FndCreateExpHeap(startAddress, size) \ + NNS_FndCreateExpHeapEx(startAddress, size, 0) +#define NNS_FndAllocFromExpHeap(heap, size) \ + NNS_FndAllocFromExpHeapEx(heap, size, NNS_FND_HEAP_DEFAULT_ALIGNMENT) + #endif //GUARD_NNS_FND_EXPHEAP_H diff --git a/arm9/lib/include/NNS_FND_heapcommon.h b/arm9/lib/include/NNS_FND_heapcommon.h index 6008e7e8..eb6f1bdb 100644 --- a/arm9/lib/include/NNS_FND_heapcommon.h +++ b/arm9/lib/include/NNS_FND_heapcommon.h @@ -3,6 +3,8 @@ #include "NNS_FND_list.h" +#define NNS_FND_HEAP_DEFAULT_ALIGNMENT 4 + typedef struct NNSiFndHeapHead NNSiFndHeapHead; struct NNSiFndHeapHead -- cgit v1.2.3