mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-23 06:34:18 -04:00
56 lines
1.5 KiB
C
56 lines
1.5 KiB
C
#include "gamealloc.h"
|
|
|
|
#include "libc64/malloc.h"
|
|
|
|
extern void* gamealloc_malloc(GameAlloc* gamealloc, size_t size) {
|
|
GameAllocList* alloc = (GameAllocList*)malloc(size + sizeof(GameAllocList));
|
|
|
|
if (alloc != NULL) {
|
|
alloc->alloc_size = size;
|
|
alloc->prev = gamealloc->tail;
|
|
gamealloc->tail->next = alloc;
|
|
gamealloc->tail = alloc;
|
|
gamealloc->tail->next = &gamealloc->head;
|
|
gamealloc->head.prev = gamealloc->tail;
|
|
|
|
return (void*)(alloc + 1); // data starts after GameAllocList structure
|
|
}
|
|
else {
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
extern void gamealloc_free(GameAlloc* gamealloc, void* ptr) {
|
|
if (ptr != NULL) {
|
|
GameAllocList* alloc = ((GameAllocList*)ptr) - 1; // back up to GameAllocList struct
|
|
|
|
alloc->prev->next = alloc->next;
|
|
alloc->next->prev = alloc->prev;
|
|
gamealloc->tail = gamealloc->head.prev;
|
|
|
|
free(alloc);
|
|
}
|
|
}
|
|
|
|
extern void gamealloc_cleanup(GameAlloc* gamealloc) {
|
|
GameAllocList* now_p = gamealloc->head.next;
|
|
GameAllocList* end_p = &gamealloc->head;
|
|
|
|
/* Go through entire list and free each until we wrap around to the head list */
|
|
while (now_p != end_p) {
|
|
GameAllocList* temp_p = now_p;
|
|
now_p = now_p->next;
|
|
free(temp_p);
|
|
}
|
|
|
|
gamealloc->tail = end_p;
|
|
gamealloc->head.next = gamealloc->tail;
|
|
gamealloc->head.prev = gamealloc->tail;
|
|
}
|
|
|
|
extern void gamealloc_init(GameAlloc* gamealloc) {
|
|
gamealloc->tail = &gamealloc->head;
|
|
gamealloc->head.next = gamealloc->tail;
|
|
gamealloc->head.prev = gamealloc->tail;
|
|
}
|