Files
ac-decomp/src/gamealloc.c
T
2023-12-09 13:34:31 +01:00

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;
}