From 0a7f7fc909c2bc0120002693a6b2052704a375fd Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 18 Aug 2021 20:11:27 -0400 Subject: NNS_FND_allocator --- arm9/lib/libnns/src/NNS_FND_allocator.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 arm9/lib/libnns/src/NNS_FND_allocator.c (limited to 'arm9/lib/libnns/src') diff --git a/arm9/lib/libnns/src/NNS_FND_allocator.c b/arm9/lib/libnns/src/NNS_FND_allocator.c new file mode 100644 index 00000000..31d0eb70 --- /dev/null +++ b/arm9/lib/libnns/src/NNS_FND_allocator.c @@ -0,0 +1,32 @@ +#include "nitro.h" +#include "NNS_FND_allocator.h" +#include "NNS_FND_expheap.h" + +void *AllocatorAllocForExpHeap(NNSFndAllocator * pAllocator, u32 size) +{ + return NNS_FndAllocFromExpHeapEx(pAllocator->pHeap, size, pAllocator->heapParam1); +} + +void AllocatorFreeForExpHeap(NNSFndAllocator * pAllocator, void *memBlock) +{ + NNS_FndFreeToExpHeap(pAllocator->pHeap, memBlock); +} + +void *NNS_FndAllocFromAllocator(NNSFndAllocator * pAllocator, u32 size) +{ + return pAllocator->pFunc->pfAlloc(pAllocator, size); +} + +void NNS_FndFreeToAllocator(NNSFndAllocator * pAllocator, void *memBlock) +{ + pAllocator->pFunc->pfFree(pAllocator, memBlock); +} + +void NNS_FndInitAllocatorForExpHeap(NNSFndAllocator * pAllocator, NNSFndHeapHandle pHeap, int alignment) +{ + static const NNSFndAllocatorFunc pFunc = {AllocatorAllocForExpHeap, AllocatorFreeForExpHeap}; + pAllocator->pFunc = &pFunc; + pAllocator->pHeap = pHeap; + pAllocator->heapParam1 = alignment; + pAllocator->heapParam2 = 0; +} -- cgit v1.2.3 From 37461da16af3814029d9ae6adcdb6483872a6eb4 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 18 Aug 2021 20:51:11 -0400 Subject: NNS_FND_heapcommon --- arm9/lib/libnns/src/NNS_FND_heapcommon.c | 61 ++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 arm9/lib/libnns/src/NNS_FND_heapcommon.c (limited to 'arm9/lib/libnns/src') diff --git a/arm9/lib/libnns/src/NNS_FND_heapcommon.c b/arm9/lib/libnns/src/NNS_FND_heapcommon.c new file mode 100644 index 00000000..2520aab2 --- /dev/null +++ b/arm9/lib/libnns/src/NNS_FND_heapcommon.c @@ -0,0 +1,61 @@ +#include "nitro.h" +#include "NNS_FND_heapcommon.h" +#include "NNS_FND_list.h" + +BOOL sRootListInitialized; +NNSFndList sRootList; + +static inline void NNSi_FndHeapHeadSetOptionFlag(NNSiFndHeapHead *pHead, u8 option_flag) +{ + pHead->attribute &= ~0xFF; + pHead->attribute |= option_flag; +} + +void *NNS_FndGetNextListObject(NNSFndList *, void *); + +NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock) +{ + NNSiFndHeapHead * pHead = NULL; + + while ((pHead = NNS_FndGetNextListObject(pList, pHead)) != NULL) + { + if (pHead->heapStart <= memBlock && memBlock < pHead->heapEnd) + { + NNSiFndHeapHead * ret = FindContainHeap(&pHead->childList, memBlock); + if (ret == NULL) + ret = pHead; + return ret; + } + } + return NULL; +} + +NNSFndList* FindListContainHeap(const void * memBlock) +{ + NNSFndList* ret = &sRootList; + NNSiFndHeapHead* pHead = FindContainHeap(&sRootList, memBlock); + if (pHead != NULL) + ret = &pHead->childList; + return ret; +} + +void NNSi_FndInitHeapHead(NNSiFndHeapHead *pHead, u32 signature, void* heapStart, void* heapEnd, u16 optionFlag) +{ + pHead->signature = signature; + pHead->heapStart = heapStart; + pHead->heapEnd = heapEnd; + pHead->attribute = 0; + NNSi_FndHeapHeadSetOptionFlag(pHead, optionFlag); + NNS_FndInitList(&pHead->childList, 4); + if (!sRootListInitialized) + { + NNS_FndInitList(&sRootList, 4); + sRootListInitialized = TRUE; + } + NNS_FndAppendListObject(FindListContainHeap(pHead), pHead); +} + +void NNSi_FndFinalizeHeap(NNSiFndHeapHead *pHead) +{ + NNS_FndRemoveListObject(FindListContainHeap(pHead), pHead); +} -- cgit v1.2.3 From 0b1d351cd70a5b5e170d77d2880f806d88d45073 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 19 Aug 2021 08:33:07 -0400 Subject: NNS_FND_list --- arm9/lib/libnns/src/NNS_FND_heapcommon.c | 4 +- arm9/lib/libnns/src/NNS_FND_list.c | 128 +++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 arm9/lib/libnns/src/NNS_FND_list.c (limited to 'arm9/lib/libnns/src') diff --git a/arm9/lib/libnns/src/NNS_FND_heapcommon.c b/arm9/lib/libnns/src/NNS_FND_heapcommon.c index 2520aab2..664007f1 100644 --- a/arm9/lib/libnns/src/NNS_FND_heapcommon.c +++ b/arm9/lib/libnns/src/NNS_FND_heapcommon.c @@ -13,7 +13,7 @@ static inline void NNSi_FndHeapHeadSetOptionFlag(NNSiFndHeapHead *pHead, u8 opti void *NNS_FndGetNextListObject(NNSFndList *, void *); -NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock) +static NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock) { NNSiFndHeapHead * pHead = NULL; @@ -30,7 +30,7 @@ NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock) return NULL; } -NNSFndList* FindListContainHeap(const void * memBlock) +static NNSFndList* FindListContainHeap(const void * memBlock) { NNSFndList* ret = &sRootList; NNSiFndHeapHead* pHead = FindContainHeap(&sRootList, memBlock); diff --git a/arm9/lib/libnns/src/NNS_FND_list.c b/arm9/lib/libnns/src/NNS_FND_list.c new file mode 100644 index 00000000..d4dd7620 --- /dev/null +++ b/arm9/lib/libnns/src/NNS_FND_list.c @@ -0,0 +1,128 @@ +#include "nitro.h" +#include "NNS_FND_list.h" + +#define OBJ_TO_LINK(list, obj) ((NNSFndLink*)((void*)(obj) + (list)->offset)) + +void NNS_FndInitList(NNSFndList* list, s32 alignment) +{ + list->headObject = NULL; + list->tailObject = NULL; + list->numObjects = 0; + list->offset = (u16)alignment; +} + +static void SetFirstObject(NNSFndList* list, void* object) +{ + NNSFndLink* tail = OBJ_TO_LINK(list, object); + tail->nextObject = NULL; + tail->prevObject = NULL; + list->headObject = object; + list->tailObject = object; + list->numObjects++; +} + +void NNS_FndAppendListObject(NNSFndList* list, void* object) +{ + if (list->headObject == NULL) + { + SetFirstObject(list, object); + } + else + { + NNSFndLink *tail = OBJ_TO_LINK(list, object); + tail->prevObject = list->tailObject; + tail->nextObject = NULL; + OBJ_TO_LINK(list, list->tailObject)->nextObject = object; + list->tailObject = object; + list->numObjects++; + } +} + +void NNS_FndPrependListObject(NNSFndList* list, void* object) +{ + if (list->headObject == NULL) + { + SetFirstObject(list, object); + } + else + { + NNSFndLink *tail = OBJ_TO_LINK(list, object); + tail->prevObject = NULL; + tail->nextObject = list->headObject; + OBJ_TO_LINK(list, list->headObject)->prevObject = object; + list->headObject = object; + list->numObjects++; + } +} + +void NNS_FndInsertListObject(NNSFndList* list, void* where, void* object) +{ + if (where == NULL) + { + NNS_FndAppendListObject(list, object); + } + + else if (where == list->headObject) + { + NNS_FndPrependListObject(list, object); + } + else + { + NNSFndLink* tail = OBJ_TO_LINK(list, object); + void* prevObject = OBJ_TO_LINK(list, where)->prevObject; + NNSFndLink* head = OBJ_TO_LINK(list, prevObject); + tail->prevObject = prevObject; + tail->nextObject = where; + head->nextObject = object; + OBJ_TO_LINK(list, where)->prevObject = object; + list->numObjects++; + } +} + +void NNS_FndRemoveListObject(NNSFndList* list, void* object) +{ + NNSFndLink* node = OBJ_TO_LINK(list, object); + if (node->prevObject == NULL) + { + list->headObject = node->nextObject; + } + else + { + OBJ_TO_LINK(list, node->prevObject)->nextObject = node->nextObject; + } + if (node->nextObject == NULL) + { + list->tailObject = node->prevObject; + } + else + { + OBJ_TO_LINK(list, node->nextObject)->prevObject = node->prevObject; + } + node->prevObject = NULL; + node->nextObject = NULL; + list->numObjects--; +} + +void * NNS_FndGetNextListObject(NNSFndList* list, void* object) +{ + if (object == NULL) + { + return list->headObject; + } + else + { + return OBJ_TO_LINK(list, object)->nextObject; + } +} + +void * NNS_FndGetPrevListObject(NNSFndList* list, void* object) +{ + if (object == NULL) + { + return list->tailObject; + } + else + { + return OBJ_TO_LINK(list, object)->prevObject; + } +} -- cgit v1.2.3 From db7cbefcdf746fbc34179f33c0930ebd07ee6f0a Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 19 Aug 2021 19:51:52 -0400 Subject: NNS_FND_expheap, 1 --- arm9/lib/libnns/src/NNS_FND_expheap.c | 92 ++++++++++++++++++++++++++++++++ arm9/lib/libnns/src/NNS_FND_heapcommon.c | 8 +-- 2 files changed, 93 insertions(+), 7 deletions(-) create mode 100644 arm9/lib/libnns/src/NNS_FND_expheap.c (limited to 'arm9/lib/libnns/src') diff --git a/arm9/lib/libnns/src/NNS_FND_expheap.c b/arm9/lib/libnns/src/NNS_FND_expheap.c new file mode 100644 index 00000000..70e3886a --- /dev/null +++ b/arm9/lib/libnns/src/NNS_FND_expheap.c @@ -0,0 +1,92 @@ +#include "global.h" +#include "NNS_FND_expheap.h" + +typedef struct NNSiMemRegion { + void* start; + void* end; +} NNSiMemRegion; + +static inline u16 GetAlignmentForMBlock(NNSiFndExpHeapMBlockHead* block) +{ + return NNSi_FndGetBitValue(block->attribute, 8, 7); +} + +static inline void* GetMemPtrForMBlock(NNSiFndExpHeapMBlockHead* block) +{ + return AddU32ToPtr(block, sizeof(NNSiFndExpHeapMBlockHead)); +} + +static inline void* GetMBlockEndAddr(NNSiFndExpHeapMBlockHead* block) +{ + return AddU32ToPtr(GetMemPtrForMBlock(block), block->blockSize); +} + +void GetRegionOfMBlock(NNSiMemRegion* region, NNSiFndExpHeapMBlockHead* block) +{ + region->start = SubU32ToPtr(block, GetAlignmentForMBlock(block)); + region->end = GetMBlockEndAddr(block); +} + +NNSiFndExpHeapMBlockHead* RemoveMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHeapMBlockHead* block) +{ + NNSiFndExpHeapMBlockHead* const prev = block->pMBHeadPrev; + NNSiFndExpHeapMBlockHead* const next = block->pMBHeadNext; + + if (prev != NULL) + { + prev->pMBHeadNext = next; + } + else + { + list->head = next; + } + + if (next != NULL) + { + next->pMBHeadPrev = prev; + } + else + { + list->tail = prev; + } + + return prev; +} + +NNSiFndExpHeapMBlockHead* InsertMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHeapMBlockHead* target, NNSiFndExpHeapMBlockHead* prev) +{ + NNSiFndExpHeapMBlockHead* next; + target->pMBHeadPrev = prev; + if (prev != NULL) + { + next = prev->pMBHeadNext; + prev->pMBHeadNext = target; + } + else + { + next = list->head; + list->head = target; + } + target->pMBHeadNext = next; + if (next != NULL) + { + next->pMBHeadPrev = target; + } + else + { + list->tail = target; + } + + return target; +} + +NNSiFndExpHeapMBlockHead* InitMBlock(const NNSiMemRegion* pRegion, u16 signature) +{ + NNSiFndExpHeapMBlockHead* block = pRegion->start; + block->signature = signature; + block->attribute = 0; + block->blockSize = GetOffsetFromPtr(GetMemPtrForMBlock(block), pRegion->end); + block->pMBHeadPrev = NULL; + block->pMBHeadNext = NULL; + return block; +} diff --git a/arm9/lib/libnns/src/NNS_FND_heapcommon.c b/arm9/lib/libnns/src/NNS_FND_heapcommon.c index 664007f1..07b8e9cf 100644 --- a/arm9/lib/libnns/src/NNS_FND_heapcommon.c +++ b/arm9/lib/libnns/src/NNS_FND_heapcommon.c @@ -5,12 +5,6 @@ BOOL sRootListInitialized; NNSFndList sRootList; -static inline void NNSi_FndHeapHeadSetOptionFlag(NNSiFndHeapHead *pHead, u8 option_flag) -{ - pHead->attribute &= ~0xFF; - pHead->attribute |= option_flag; -} - void *NNS_FndGetNextListObject(NNSFndList *, void *); static NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock) @@ -45,7 +39,7 @@ void NNSi_FndInitHeapHead(NNSiFndHeapHead *pHead, u32 signature, void* heapStart pHead->heapStart = heapStart; pHead->heapEnd = heapEnd; pHead->attribute = 0; - NNSi_FndHeapHeadSetOptionFlag(pHead, optionFlag); + SetOptForHeap(pHead, optionFlag); NNS_FndInitList(&pHead->childList, 4); if (!sRootListInitialized) { -- cgit v1.2.3 From 963a657ad585ac3bb70d8a0f78e35ea54145eacc Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 20 Aug 2021 08:14:19 -0400 Subject: InitExpHeap --- arm9/lib/libnns/src/NNS_FND_expheap.c | 39 +++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'arm9/lib/libnns/src') diff --git a/arm9/lib/libnns/src/NNS_FND_expheap.c b/arm9/lib/libnns/src/NNS_FND_expheap.c index 70e3886a..eee4f9ca 100644 --- a/arm9/lib/libnns/src/NNS_FND_expheap.c +++ b/arm9/lib/libnns/src/NNS_FND_expheap.c @@ -21,6 +21,16 @@ static inline void* GetMBlockEndAddr(NNSiFndExpHeapMBlockHead* block) return AddU32ToPtr(GetMemPtrForMBlock(block), block->blockSize); } +static inline void SetAllocMode(NNSiFndExpHeapHead* pExHeapHd, u16 mode) +{ + NNSi_FndSetBitValue(pExHeapHd->feature, 0, 1, mode); +} + +static inline NNSiFndExpHeapHead* GetExpHeapHeadPtrFromHeapHead(NNSiFndHeapHead* pHHead) +{ + return AddU32ToPtr(pHHead, sizeof(NNSiFndHeapHead)); +} + void GetRegionOfMBlock(NNSiMemRegion* region, NNSiFndExpHeapMBlockHead* block) { region->start = SubU32ToPtr(block, GetAlignmentForMBlock(block)); @@ -90,3 +100,32 @@ NNSiFndExpHeapMBlockHead* InitMBlock(const NNSiMemRegion* pRegion, u16 signature block->pMBHeadNext = NULL; return block; } + +static inline NNSiFndExpHeapMBlockHead* InitFreeMBlock(const NNSiMemRegion* region) +{ + return InitMBlock(region, 0x4652); +} + +NNSiFndHeapHead* InitExpHeap(void* startAddress, void* endAddress, u16 optFlag) +{ + NNSiFndHeapHead* pHeapHd = (NNSiFndHeapHead*)startAddress; + NNSiFndExpHeapHead* pExpHeapHd = GetExpHeapHeadPtrFromHeapHead(pHeapHd); + NNSi_FndInitHeapHead(pHeapHd, 0x45585048, AddU32ToPtr(pExpHeapHd, sizeof(NNSiFndExpHeapHead)), endAddress, optFlag); + pExpHeapHd->groupID = 0; + pExpHeapHd->feature = 0; + SetAllocMode(pExpHeapHd, 0); + + NNSiFndExpHeapMBlockHead* pMBHead; + NNSiMemRegion region; + + region.start = pHeapHd->heapStart; + region.end = pHeapHd->heapEnd; + pMBHead = InitFreeMBlock(®ion); + + pExpHeapHd->mbFreeList.head = pMBHead; + pExpHeapHd->mbFreeList.tail = pMBHead; + pExpHeapHd->mbUsedList.head = NULL; + pExpHeapHd->mbUsedList.tail = NULL; + + return pHeapHd; +} -- cgit v1.2.3 From bcf0ab205d42d5653215da7b19ece57d74438417 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 20 Aug 2021 18:46:22 -0400 Subject: AllocUsedBlockFromFreeBlock --- arm9/lib/libnns/src/NNS_FND_expheap.c | 73 +++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) (limited to 'arm9/lib/libnns/src') diff --git a/arm9/lib/libnns/src/NNS_FND_expheap.c b/arm9/lib/libnns/src/NNS_FND_expheap.c index eee4f9ca..f5a74dc4 100644 --- a/arm9/lib/libnns/src/NNS_FND_expheap.c +++ b/arm9/lib/libnns/src/NNS_FND_expheap.c @@ -11,6 +11,21 @@ static inline u16 GetAlignmentForMBlock(NNSiFndExpHeapMBlockHead* block) return NNSi_FndGetBitValue(block->attribute, 8, 7); } +static inline void SetAllocDirForMBlock(NNSiFndExpHeapMBlockHead* pEHMBHead, u16 direction) +{ + NNSi_FndSetBitValue(pEHMBHead->attribute, 15, 1, direction); +} + +static inline void SetAlignmentForMBlock(NNSiFndExpHeapMBlockHead* pEHMBHead, u16 alignment) +{ + NNSi_FndSetBitValue(pEHMBHead->attribute, 8, 7, alignment); +} + +static inline void SetGroupIDForMBlock(NNSiFndExpHeapMBlockHead* pEHMBHead, u16 groupID) +{ + NNSi_FndSetBitValue(pEHMBHead->attribute, 0, 8, groupID); +} + static inline void* GetMemPtrForMBlock(NNSiFndExpHeapMBlockHead* block) { return AddU32ToPtr(block, sizeof(NNSiFndExpHeapMBlockHead)); @@ -31,6 +46,11 @@ static inline NNSiFndExpHeapHead* GetExpHeapHeadPtrFromHeapHead(NNSiFndHeapHead* return AddU32ToPtr(pHHead, sizeof(NNSiFndHeapHead)); } +static inline NNSiFndHeapHead* GetHeapHeadPtrFromExpHeapHead(NNSiFndExpHeapHead* pEHHead) +{ + return SubU32ToPtr(pEHHead, sizeof(NNSiFndHeapHead)); +} + void GetRegionOfMBlock(NNSiMemRegion* region, NNSiFndExpHeapMBlockHead* block) { region->start = SubU32ToPtr(block, GetAlignmentForMBlock(block)); @@ -129,3 +149,56 @@ NNSiFndHeapHead* InitExpHeap(void* startAddress, void* endAddress, u16 optFlag) return pHeapHd; } + +static inline void AppendMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHeapMBlockHead* block) +{ + (void) InsertMBlock(list, block, list->tail); +} + +void* AllocUsedBlockFromFreeBlock(NNSiFndExpHeapHead* pEHHead, NNSiFndExpHeapMBlockHead* pMBHeadFree, void* mblock, u32 size, u16 direction) +{ + NNSiMemRegion freeRgnT; + NNSiMemRegion freeRgnB; + NNSiFndExpHeapMBlockHead* pMBHeadFreePrev; + + GetRegionOfMBlock(&freeRgnT, pMBHeadFree); + + freeRgnB.end = freeRgnT.end; + freeRgnB.start = AddU32ToPtr(mblock, size); + freeRgnT.end = SubU32ToPtr(mblock, sizeof(NNSiFndExpHeapMBlockHead)); + + pMBHeadFreePrev = RemoveMBlock(&pEHHead->mbFreeList, pMBHeadFree); + + if (GetOffsetFromPtr(freeRgnT.start, freeRgnT.end) < sizeof(NNSiFndExpHeapMBlockHead)) + { + freeRgnT.end = freeRgnT.start; + } + else + { + pMBHeadFreePrev = InsertMBlock(&pEHHead->mbFreeList, InitFreeMBlock(&freeRgnT), pMBHeadFreePrev); + } + if (GetOffsetFromPtr(freeRgnB.start, freeRgnB.end) < sizeof(NNSiFndExpHeapMBlockHead)) + { + freeRgnB.start= freeRgnB.end; + } + else + { + (void)InsertMBlock(&pEHHead->mbFreeList, InitFreeMBlock(&freeRgnB), pMBHeadFreePrev); + } + + FillAllocMemory(GetHeapHeadPtrFromExpHeapHead(pEHHead), freeRgnT.end, GetOffsetFromPtr(freeRgnT.end, freeRgnB.start)); + + NNSiFndExpHeapMBlockHead* pMBHeadNewUsed; + NNSiMemRegion region; + + region.start = SubU32ToPtr(mblock, sizeof(NNSiFndExpHeapMBlockHead)); + region.end = freeRgnB.start; + + pMBHeadNewUsed = InitMBlock(®ion, 0x5544); + SetAllocDirForMBlock(pMBHeadNewUsed, direction); + SetAlignmentForMBlock(pMBHeadNewUsed, (u16)GetOffsetFromPtr(freeRgnT.end, pMBHeadNewUsed)); + SetGroupIDForMBlock(pMBHeadNewUsed, pEHHead->groupID); + AppendMBlock(&pEHHead->mbUsedList, pMBHeadNewUsed); + + return mblock; +} -- cgit v1.2.3 From cb6f5a1c7ad38e09cb47d402b2b5d78fdd5965cc Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 20 Aug 2021 21:00:20 -0400 Subject: AllocFromHead, ALlocFromTail --- arm9/lib/libnns/src/NNS_FND_expheap.c | 65 +++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) (limited to 'arm9/lib/libnns/src') diff --git a/arm9/lib/libnns/src/NNS_FND_expheap.c b/arm9/lib/libnns/src/NNS_FND_expheap.c index f5a74dc4..31ea5fbe 100644 --- a/arm9/lib/libnns/src/NNS_FND_expheap.c +++ b/arm9/lib/libnns/src/NNS_FND_expheap.c @@ -36,6 +36,11 @@ static inline void* GetMBlockEndAddr(NNSiFndExpHeapMBlockHead* block) return AddU32ToPtr(GetMemPtrForMBlock(block), block->blockSize); } +static inline u16 GetAllocMode(NNSiFndExpHeapHead* pExHeapHd) +{ + return NNSi_FndGetBitValue(pExHeapHd->feature, 0, 1); +} + static inline void SetAllocMode(NNSiFndExpHeapHead* pExHeapHd, u16 mode) { NNSi_FndSetBitValue(pExHeapHd->feature, 0, 1, mode); @@ -202,3 +207,63 @@ void* AllocUsedBlockFromFreeBlock(NNSiFndExpHeapHead* pEHHead, NNSiFndExpHeapMBl return mblock; } + +void* AllocFromHead(NNSiFndHeapHead* pHeapHd, u32 size, int alignment) +{ + NNSiFndExpHeapHead* pExpHeapHd = GetExpHeapHeadPtrFromHeapHead(pHeapHd); + const BOOL bAllocFirst = GetAllocMode(pExpHeapHd) == 0; + NNSiFndExpHeapMBlockHead* pMBlkHd = NULL; + NNSiFndExpHeapMBlockHead* pMBlkHdFound = NULL; + u32 foundSize = 0xFFFFFFFF; + void* foundMBlock = NULL; + + for (pMBlkHd = pExpHeapHd->mbFreeList.head; pMBlkHd; pMBlkHd = pMBlkHd->pMBHeadNext) + { + void *const mblock = GetMemPtrForMBlock(pMBlkHd); + void *const reqMBlock = NNSi_FndRoundUpPtr(mblock, alignment); + const u32 offset = GetOffsetFromPtr(mblock, reqMBlock); + if (pMBlkHd->blockSize >= size + offset && foundSize > pMBlkHd->blockSize) + { + pMBlkHdFound = pMBlkHd; + foundSize = pMBlkHd->blockSize; + foundMBlock = reqMBlock; + if (bAllocFirst || foundSize == size) + break; + } + } + + if (!pMBlkHdFound) + return NULL; + + return AllocUsedBlockFromFreeBlock(pExpHeapHd, pMBlkHdFound, foundMBlock, size, 0); +} + +void* AllocFromTail(NNSiFndHeapHead* pHeapHd, u32 size, int alignment) +{ + NNSiFndExpHeapHead* pExpHeapHd = GetExpHeapHeadPtrFromHeapHead(pHeapHd); + const BOOL bAllocFirst = GetAllocMode(pExpHeapHd) == 0; + NNSiFndExpHeapMBlockHead* pMBlkHd = NULL; + NNSiFndExpHeapMBlockHead* pMBlkHdFound = NULL; + u32 foundSize = 0xFFFFFFFF; + void* foundMBlock = NULL; + + for (pMBlkHd = pExpHeapHd->mbFreeList.tail; pMBlkHd; pMBlkHd = pMBlkHd->pMBHeadPrev) + { + void *const mblock = GetMemPtrForMBlock(pMBlkHd); + void *const mBlockEnd = AddU32ToPtr(mblock, pMBlkHd->blockSize); + void *const reqMBlock = NNSi_FndRoundDownPtr(SubU32ToPtr(mBlockEnd, size), alignment); + if (ComparePtr(reqMBlock, mblock) >= 0 && foundSize > pMBlkHd->blockSize) + { + pMBlkHdFound = pMBlkHd; + foundSize = pMBlkHd->blockSize; + foundMBlock = reqMBlock; + if (bAllocFirst || foundSize == size) + break; + } + } + + if (!pMBlkHdFound) + return NULL; + + return AllocUsedBlockFromFreeBlock(pExpHeapHd, pMBlkHdFound, foundMBlock, size, 1); +} -- cgit v1.2.3 From 676ebab3d6ad726b3e154c994c4fcfdbb186ed22 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 21 Aug 2021 11:02:05 -0400 Subject: through NNS_FndAllocFromExpHeapEx --- arm9/lib/libnns/src/NNS_FND_expheap.c | 116 ++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) (limited to 'arm9/lib/libnns/src') diff --git a/arm9/lib/libnns/src/NNS_FND_expheap.c b/arm9/lib/libnns/src/NNS_FND_expheap.c index 31ea5fbe..15657c43 100644 --- a/arm9/lib/libnns/src/NNS_FND_expheap.c +++ b/arm9/lib/libnns/src/NNS_FND_expheap.c @@ -31,6 +31,11 @@ static inline void* GetMemPtrForMBlock(NNSiFndExpHeapMBlockHead* block) return AddU32ToPtr(block, sizeof(NNSiFndExpHeapMBlockHead)); } +static inline void* GetMBlockHeadPtr(void* block) +{ + return SubU32ToPtr(block, sizeof(NNSiFndExpHeapMBlockHead)); +} + static inline void* GetMBlockEndAddr(NNSiFndExpHeapMBlockHead* block) { return AddU32ToPtr(GetMemPtrForMBlock(block), block->blockSize); @@ -51,6 +56,11 @@ static inline NNSiFndExpHeapHead* GetExpHeapHeadPtrFromHeapHead(NNSiFndHeapHead* return AddU32ToPtr(pHHead, sizeof(NNSiFndHeapHead)); } +static inline NNSiFndExpHeapHead* GetExpHeapHeadPtrFromHandle(NNSFndHeapHandle heap) +{ + return GetExpHeapHeadPtrFromHeapHead(heap); +} + static inline NNSiFndHeapHead* GetHeapHeadPtrFromExpHeapHead(NNSiFndExpHeapHead* pEHHead) { return SubU32ToPtr(pEHHead, sizeof(NNSiFndHeapHead)); @@ -267,3 +277,109 @@ void* AllocFromTail(NNSiFndHeapHead* pHeapHd, u32 size, int alignment) return AllocUsedBlockFromFreeBlock(pExpHeapHd, pMBlkHdFound, foundMBlock, size, 1); } + +BOOL RecycleRegion(NNSiFndExpHeapHead* pEHHead, const NNSiMemRegion* pRegion) +{ + NNSiFndExpHeapMBlockHead* pBlkPtrFree = NULL; + NNSiMemRegion freeRgn = *pRegion; + NNSiFndExpHeapMBlockHead* pBlk; + for (pBlk = pEHHead->mbFreeList.head; pBlk; pBlk = pBlk->pMBHeadNext) + { + if (pBlk < (NNSiFndExpHeapMBlockHead*)pRegion->start) + { + pBlkPtrFree = pBlk; + continue; + } + if (pBlk == pRegion->end) + { + freeRgn.end = GetMBlockEndAddr(pBlk); + (void)RemoveMBlock(&pEHHead->mbFreeList, pBlk); + } + break; + } + if (pBlkPtrFree && GetMBlockEndAddr(pBlkPtrFree) == pRegion->start) + { + freeRgn.start = pBlkPtrFree; + pBlkPtrFree = RemoveMBlock(&pEHHead->mbFreeList, pBlkPtrFree); + } + if (GetOffsetFromPtr(freeRgn.start, freeRgn.end) < sizeof(NNSiFndExpHeapMBlockHead)) + return FALSE; + InsertMBlock(&pEHHead->mbFreeList, InitFreeMBlock(&freeRgn), pBlkPtrFree); + return TRUE; +} + +NNSFndHeapHandle NNS_FndCreateExpHeapEx(void *startAddress, u32 size, u16 optFlag) +{ + void* endAddress = NNSi_FndRoundDownPtr(AddU32ToPtr(startAddress, size), 4); + startAddress = NNSi_FndRoundUpPtr(startAddress, 4); + if (NNSiGetUIntPtr(startAddress) > NNSiGetUIntPtr(endAddress) || GetOffsetFromPtr(startAddress, endAddress) < sizeof(NNSiFndHeapHead) + sizeof(NNSiFndExpHeapHead) + sizeof(NNSiFndExpHeapMBlockHead) + 4) + return NULL; + return InitExpHeap(startAddress, endAddress, optFlag); +} + +void NNS_FndDestroyExpHeap(NNSFndHeapHandle handle) +{ + NNSi_FndFinalizeHeap(handle); +} + +void* NNS_FndAllocFromExpHeapEx(NNSFndHeapHandle handle, u32 size, int alignment) +{ + if (size == 0) + size = 1; + size = NNSi_FndRoundUp(size, 4); + if (alignment >= 0) + return AllocFromHead(handle, size, alignment); + else + return AllocFromTail(handle, size, -alignment); +} + +/* +u32 NNS_FndResizeForMBlockExpHeap(NNSFndHeapHandle heap, void *memBlock, u32 size) +{ + NNSiFndExpHeapHead* pEHHead; + NNSiFndExpHeapMBlockHead* pMBHead; + pEHHead = GetExpHeapHeadPtrFromHandle(heap); + pMBHead = GetMBlockHeadPtr(memBlock); + size = NNSi_FndRoundUp(size, 4); + if (size == pMBHead->blockSize) + return size; + if (size > pMBHead->blockSize) + { + void* crUsedEnd = GetMBlockEndAddr(pMBHead); + NNSiFndExpHeapMBlockHead* block; + for (block = pEHHead->mbFreeList.head; block; block = block->pMBHeadNext) + { + if (block == crUsedEnd) + break; + } + if (!block || size > pMBHead->blockSize + sizeof(NNSiFndExpHeapMBlockHead) + block->blockSize) + return 0; + + NNSiMemRegion rgnNewFree; + void* oldFreeStart; + NNSiFndExpHeapMBlockHead* nextBlockPrev; + + GetRegionOfMBlock(&rgnNewFree, block); + nextBlockPrev = RemoveMBlock(&pEHHead->mbFreeList, block); + oldFreeStart = rgnNewFree.start; + rgnNewFree.start = AddU32ToPtr(memBlock, size); + if (GetOffsetFromPtr(rgnNewFree.start, rgnNewFree.end) < sizeof(NNSiFndExpHeapMBlockHead)) + rgnNewFree.start = rgnNewFree.end; + pMBHead->blockSize = GetOffsetFromPtr(memBlock, rgnNewFree.start); + if (GetOffsetFromPtr(rgnNewFree.start, rgnNewFree.end) >= sizeof(NNSiFndExpHeapMBlockHead)) + (void)InsertMBlock(&pEHHead->mbFreeList, InitFreeMBlock(&rgnNewFree), nextBlockPrev); + FillAllocMemory(heap, oldFreeStart, GetOffsetFromPtr(oldFreeStart, rgnNewFree.start)); + } + else + { + NNSiMemRegion rgnNewFree; + const u32 oldBlockSize = pMBHead->blockSize; + rgnNewFree.start = AddU32ToPtr(memBlock, size); + rgnNewFree.end = GetMBlockEndAddr(pMBHead); + pMBHead->blockSize = size; + if (!RecycleRegion(pEHHead, &rgnNewFree)) + pMBHead->blockSize = oldBlockSize; + } + return pMBHead->blockSize; +} +*/ -- cgit v1.2.3 From c17dcd24d24b9309ce2c1da1c709816afbea975b Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 28 Aug 2021 15:09:57 -0400 Subject: ARM_FUNC --- arm9/lib/libnns/src/NNS_FND_allocator.c | 10 +++++----- arm9/lib/libnns/src/NNS_FND_expheap.c | 26 +++++++++++++------------- arm9/lib/libnns/src/NNS_FND_heapcommon.c | 10 +++++----- arm9/lib/libnns/src/NNS_FND_list.c | 16 ++++++++-------- 4 files changed, 31 insertions(+), 31 deletions(-) (limited to 'arm9/lib/libnns/src') diff --git a/arm9/lib/libnns/src/NNS_FND_allocator.c b/arm9/lib/libnns/src/NNS_FND_allocator.c index 31d0eb70..c459c3d0 100644 --- a/arm9/lib/libnns/src/NNS_FND_allocator.c +++ b/arm9/lib/libnns/src/NNS_FND_allocator.c @@ -2,27 +2,27 @@ #include "NNS_FND_allocator.h" #include "NNS_FND_expheap.h" -void *AllocatorAllocForExpHeap(NNSFndAllocator * pAllocator, u32 size) +ARM_FUNC void *AllocatorAllocForExpHeap(NNSFndAllocator * pAllocator, u32 size) { return NNS_FndAllocFromExpHeapEx(pAllocator->pHeap, size, pAllocator->heapParam1); } -void AllocatorFreeForExpHeap(NNSFndAllocator * pAllocator, void *memBlock) +ARM_FUNC void AllocatorFreeForExpHeap(NNSFndAllocator * pAllocator, void *memBlock) { NNS_FndFreeToExpHeap(pAllocator->pHeap, memBlock); } -void *NNS_FndAllocFromAllocator(NNSFndAllocator * pAllocator, u32 size) +ARM_FUNC void *NNS_FndAllocFromAllocator(NNSFndAllocator * pAllocator, u32 size) { return pAllocator->pFunc->pfAlloc(pAllocator, size); } -void NNS_FndFreeToAllocator(NNSFndAllocator * pAllocator, void *memBlock) +ARM_FUNC void NNS_FndFreeToAllocator(NNSFndAllocator * pAllocator, void *memBlock) { pAllocator->pFunc->pfFree(pAllocator, memBlock); } -void NNS_FndInitAllocatorForExpHeap(NNSFndAllocator * pAllocator, NNSFndHeapHandle pHeap, int alignment) +ARM_FUNC void NNS_FndInitAllocatorForExpHeap(NNSFndAllocator * pAllocator, NNSFndHeapHandle pHeap, int alignment) { static const NNSFndAllocatorFunc pFunc = {AllocatorAllocForExpHeap, AllocatorFreeForExpHeap}; pAllocator->pFunc = &pFunc; diff --git a/arm9/lib/libnns/src/NNS_FND_expheap.c b/arm9/lib/libnns/src/NNS_FND_expheap.c index 15657c43..62a4deb4 100644 --- a/arm9/lib/libnns/src/NNS_FND_expheap.c +++ b/arm9/lib/libnns/src/NNS_FND_expheap.c @@ -66,13 +66,13 @@ static inline NNSiFndHeapHead* GetHeapHeadPtrFromExpHeapHead(NNSiFndExpHeapHead* return SubU32ToPtr(pEHHead, sizeof(NNSiFndHeapHead)); } -void GetRegionOfMBlock(NNSiMemRegion* region, NNSiFndExpHeapMBlockHead* block) +ARM_FUNC void GetRegionOfMBlock(NNSiMemRegion* region, NNSiFndExpHeapMBlockHead* block) { region->start = SubU32ToPtr(block, GetAlignmentForMBlock(block)); region->end = GetMBlockEndAddr(block); } -NNSiFndExpHeapMBlockHead* RemoveMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHeapMBlockHead* block) +ARM_FUNC NNSiFndExpHeapMBlockHead* RemoveMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHeapMBlockHead* block) { NNSiFndExpHeapMBlockHead* const prev = block->pMBHeadPrev; NNSiFndExpHeapMBlockHead* const next = block->pMBHeadNext; @@ -98,7 +98,7 @@ NNSiFndExpHeapMBlockHead* RemoveMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHea return prev; } -NNSiFndExpHeapMBlockHead* InsertMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHeapMBlockHead* target, NNSiFndExpHeapMBlockHead* prev) +ARM_FUNC NNSiFndExpHeapMBlockHead* InsertMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHeapMBlockHead* target, NNSiFndExpHeapMBlockHead* prev) { NNSiFndExpHeapMBlockHead* next; target->pMBHeadPrev = prev; @@ -125,7 +125,7 @@ NNSiFndExpHeapMBlockHead* InsertMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHea return target; } -NNSiFndExpHeapMBlockHead* InitMBlock(const NNSiMemRegion* pRegion, u16 signature) +ARM_FUNC NNSiFndExpHeapMBlockHead* InitMBlock(const NNSiMemRegion* pRegion, u16 signature) { NNSiFndExpHeapMBlockHead* block = pRegion->start; block->signature = signature; @@ -141,7 +141,7 @@ static inline NNSiFndExpHeapMBlockHead* InitFreeMBlock(const NNSiMemRegion* regi return InitMBlock(region, 0x4652); } -NNSiFndHeapHead* InitExpHeap(void* startAddress, void* endAddress, u16 optFlag) +ARM_FUNC NNSiFndHeapHead* InitExpHeap(void* startAddress, void* endAddress, u16 optFlag) { NNSiFndHeapHead* pHeapHd = (NNSiFndHeapHead*)startAddress; NNSiFndExpHeapHead* pExpHeapHd = GetExpHeapHeadPtrFromHeapHead(pHeapHd); @@ -170,7 +170,7 @@ static inline void AppendMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHeapMBlock (void) InsertMBlock(list, block, list->tail); } -void* AllocUsedBlockFromFreeBlock(NNSiFndExpHeapHead* pEHHead, NNSiFndExpHeapMBlockHead* pMBHeadFree, void* mblock, u32 size, u16 direction) +ARM_FUNC void* AllocUsedBlockFromFreeBlock(NNSiFndExpHeapHead* pEHHead, NNSiFndExpHeapMBlockHead* pMBHeadFree, void* mblock, u32 size, u16 direction) { NNSiMemRegion freeRgnT; NNSiMemRegion freeRgnB; @@ -218,7 +218,7 @@ void* AllocUsedBlockFromFreeBlock(NNSiFndExpHeapHead* pEHHead, NNSiFndExpHeapMBl return mblock; } -void* AllocFromHead(NNSiFndHeapHead* pHeapHd, u32 size, int alignment) +ARM_FUNC void* AllocFromHead(NNSiFndHeapHead* pHeapHd, u32 size, int alignment) { NNSiFndExpHeapHead* pExpHeapHd = GetExpHeapHeadPtrFromHeapHead(pHeapHd); const BOOL bAllocFirst = GetAllocMode(pExpHeapHd) == 0; @@ -248,7 +248,7 @@ void* AllocFromHead(NNSiFndHeapHead* pHeapHd, u32 size, int alignment) return AllocUsedBlockFromFreeBlock(pExpHeapHd, pMBlkHdFound, foundMBlock, size, 0); } -void* AllocFromTail(NNSiFndHeapHead* pHeapHd, u32 size, int alignment) +ARM_FUNC void* AllocFromTail(NNSiFndHeapHead* pHeapHd, u32 size, int alignment) { NNSiFndExpHeapHead* pExpHeapHd = GetExpHeapHeadPtrFromHeapHead(pHeapHd); const BOOL bAllocFirst = GetAllocMode(pExpHeapHd) == 0; @@ -278,7 +278,7 @@ void* AllocFromTail(NNSiFndHeapHead* pHeapHd, u32 size, int alignment) return AllocUsedBlockFromFreeBlock(pExpHeapHd, pMBlkHdFound, foundMBlock, size, 1); } -BOOL RecycleRegion(NNSiFndExpHeapHead* pEHHead, const NNSiMemRegion* pRegion) +ARM_FUNC BOOL RecycleRegion(NNSiFndExpHeapHead* pEHHead, const NNSiMemRegion* pRegion) { NNSiFndExpHeapMBlockHead* pBlkPtrFree = NULL; NNSiMemRegion freeRgn = *pRegion; @@ -308,7 +308,7 @@ BOOL RecycleRegion(NNSiFndExpHeapHead* pEHHead, const NNSiMemRegion* pRegion) return TRUE; } -NNSFndHeapHandle NNS_FndCreateExpHeapEx(void *startAddress, u32 size, u16 optFlag) +ARM_FUNC NNSFndHeapHandle NNS_FndCreateExpHeapEx(void *startAddress, u32 size, u16 optFlag) { void* endAddress = NNSi_FndRoundDownPtr(AddU32ToPtr(startAddress, size), 4); startAddress = NNSi_FndRoundUpPtr(startAddress, 4); @@ -317,12 +317,12 @@ NNSFndHeapHandle NNS_FndCreateExpHeapEx(void *startAddress, u32 size, u16 optFla return InitExpHeap(startAddress, endAddress, optFlag); } -void NNS_FndDestroyExpHeap(NNSFndHeapHandle handle) +ARM_FUNC void NNS_FndDestroyExpHeap(NNSFndHeapHandle handle) { NNSi_FndFinalizeHeap(handle); } -void* NNS_FndAllocFromExpHeapEx(NNSFndHeapHandle handle, u32 size, int alignment) +ARM_FUNC void* NNS_FndAllocFromExpHeapEx(NNSFndHeapHandle handle, u32 size, int alignment) { if (size == 0) size = 1; @@ -334,7 +334,7 @@ void* NNS_FndAllocFromExpHeapEx(NNSFndHeapHandle handle, u32 size, int alignment } /* -u32 NNS_FndResizeForMBlockExpHeap(NNSFndHeapHandle heap, void *memBlock, u32 size) +ARM_FUNC u32 NNS_FndResizeForMBlockExpHeap(NNSFndHeapHandle heap, void *memBlock, u32 size) { NNSiFndExpHeapHead* pEHHead; NNSiFndExpHeapMBlockHead* pMBHead; diff --git a/arm9/lib/libnns/src/NNS_FND_heapcommon.c b/arm9/lib/libnns/src/NNS_FND_heapcommon.c index 07b8e9cf..73646030 100644 --- a/arm9/lib/libnns/src/NNS_FND_heapcommon.c +++ b/arm9/lib/libnns/src/NNS_FND_heapcommon.c @@ -5,9 +5,9 @@ BOOL sRootListInitialized; NNSFndList sRootList; -void *NNS_FndGetNextListObject(NNSFndList *, void *); +ARM_FUNC void *NNS_FndGetNextListObject(NNSFndList *, void *); -static NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock) +ARM_FUNC static NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock) { NNSiFndHeapHead * pHead = NULL; @@ -24,7 +24,7 @@ static NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBloc return NULL; } -static NNSFndList* FindListContainHeap(const void * memBlock) +ARM_FUNC static NNSFndList* FindListContainHeap(const void * memBlock) { NNSFndList* ret = &sRootList; NNSiFndHeapHead* pHead = FindContainHeap(&sRootList, memBlock); @@ -33,7 +33,7 @@ static NNSFndList* FindListContainHeap(const void * memBlock) return ret; } -void NNSi_FndInitHeapHead(NNSiFndHeapHead *pHead, u32 signature, void* heapStart, void* heapEnd, u16 optionFlag) +ARM_FUNC void NNSi_FndInitHeapHead(NNSiFndHeapHead *pHead, u32 signature, void* heapStart, void* heapEnd, u16 optionFlag) { pHead->signature = signature; pHead->heapStart = heapStart; @@ -49,7 +49,7 @@ void NNSi_FndInitHeapHead(NNSiFndHeapHead *pHead, u32 signature, void* heapStart NNS_FndAppendListObject(FindListContainHeap(pHead), pHead); } -void NNSi_FndFinalizeHeap(NNSiFndHeapHead *pHead) +ARM_FUNC void NNSi_FndFinalizeHeap(NNSiFndHeapHead *pHead) { NNS_FndRemoveListObject(FindListContainHeap(pHead), pHead); } diff --git a/arm9/lib/libnns/src/NNS_FND_list.c b/arm9/lib/libnns/src/NNS_FND_list.c index d4dd7620..fdab8188 100644 --- a/arm9/lib/libnns/src/NNS_FND_list.c +++ b/arm9/lib/libnns/src/NNS_FND_list.c @@ -3,7 +3,7 @@ #define OBJ_TO_LINK(list, obj) ((NNSFndLink*)((void*)(obj) + (list)->offset)) -void NNS_FndInitList(NNSFndList* list, s32 alignment) +ARM_FUNC void NNS_FndInitList(NNSFndList* list, s32 alignment) { list->headObject = NULL; list->tailObject = NULL; @@ -11,7 +11,7 @@ void NNS_FndInitList(NNSFndList* list, s32 alignment) list->offset = (u16)alignment; } -static void SetFirstObject(NNSFndList* list, void* object) +ARM_FUNC static void SetFirstObject(NNSFndList* list, void* object) { NNSFndLink* tail = OBJ_TO_LINK(list, object); tail->nextObject = NULL; @@ -21,7 +21,7 @@ static void SetFirstObject(NNSFndList* list, void* object) list->numObjects++; } -void NNS_FndAppendListObject(NNSFndList* list, void* object) +ARM_FUNC void NNS_FndAppendListObject(NNSFndList* list, void* object) { if (list->headObject == NULL) { @@ -38,7 +38,7 @@ void NNS_FndAppendListObject(NNSFndList* list, void* object) } } -void NNS_FndPrependListObject(NNSFndList* list, void* object) +ARM_FUNC void NNS_FndPrependListObject(NNSFndList* list, void* object) { if (list->headObject == NULL) { @@ -55,7 +55,7 @@ void NNS_FndPrependListObject(NNSFndList* list, void* object) } } -void NNS_FndInsertListObject(NNSFndList* list, void* where, void* object) +ARM_FUNC void NNS_FndInsertListObject(NNSFndList* list, void* where, void* object) { if (where == NULL) { @@ -79,7 +79,7 @@ void NNS_FndInsertListObject(NNSFndList* list, void* where, void* object) } } -void NNS_FndRemoveListObject(NNSFndList* list, void* object) +ARM_FUNC void NNS_FndRemoveListObject(NNSFndList* list, void* object) { NNSFndLink* node = OBJ_TO_LINK(list, object); if (node->prevObject == NULL) @@ -103,7 +103,7 @@ void NNS_FndRemoveListObject(NNSFndList* list, void* object) list->numObjects--; } -void * NNS_FndGetNextListObject(NNSFndList* list, void* object) +ARM_FUNC void * NNS_FndGetNextListObject(NNSFndList* list, void* object) { if (object == NULL) { @@ -115,7 +115,7 @@ void * NNS_FndGetNextListObject(NNSFndList* list, void* object) } } -void * NNS_FndGetPrevListObject(NNSFndList* list, void* object) +ARM_FUNC void * NNS_FndGetPrevListObject(NNSFndList* list, void* object) { if (object == NULL) { -- cgit v1.2.3