summaryrefslogtreecommitdiff
path: root/core/alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/alloc.c')
-rw-r--r--core/alloc.c157
1 files changed, 0 insertions, 157 deletions
diff --git a/core/alloc.c b/core/alloc.c
deleted file mode 100644
index 0ed705c..0000000
--- a/core/alloc.c
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Rune Game Engine
- * Copyright 2024 Danny Holman <dholman@gymli.org>
- *
- * This software is provided 'as-is', without any express or implied
- * warranty. In no event will the authors be held liable for any damages
- * arising from the use of this software.
- *
- * Permission is granted to anyone to use this software for any purpose,
- * including commercial applications, and to alter it and redistribute it
- * freely, subject to the following restrictions:
- *
- * 1. The origin of this software must not be misrepresented; you must not
- * claim that you wrote the original software. If you use this software
- * in a product, an acknowledgment in the product documentation would be
- * appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- * misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- */
-
-#include <rune/core/alloc.h>
-#include <rune/core/logging.h>
-#include <stdlib.h>
-#include <string.h>
-
-// TODO: implement block coalescing so we can reuse freed blocks
-
-#define DEADBLOCK ((void*)0xDEADBEEF)
-
-static mem_block_t first_block;
-
-static mem_block_t* _find_free_block(size_t sz) {
- list_head_t *temp = &first_block.list;
- mem_block_t *block;
- while (temp != NULL) {
- block = (mem_block_t*)((void*)temp - offsetof(mem_block_t, list));
- if (block->sz == sz && block->free == 1)
- return block;
- temp = temp->next;
- }
- return NULL;
-}
-
-static mem_block_t* _find_block(void *ptr) {
- list_head_t *temp = &first_block.list;
- mem_block_t *block;
- while (temp != NULL) {
- block = (mem_block_t*)((void*)temp - offsetof(mem_block_t, list));
- if (block->ptr == ptr)
- return block;
- temp = temp->next;
- }
- return NULL;
-}
-
-static mem_block_t* _alloc_block(size_t sz) {
- if (first_block.ptr == NULL) {
- first_block.ptr == DEADBLOCK;
- first_block.sz = 0;
- }
-
- mem_block_t *ret = _find_free_block(sz);
- if (ret != NULL) {
- ret->free = 0;
- return ret->ptr;
- }
-
- ret = malloc(sizeof(mem_block_t));
- if (ret == NULL) {
- log_output(LOG_ERROR, "Cannot allocate block of size %d", sz);
- return NULL;
- }
-
- ret->ptr = malloc(sz);
- ret->sz = sz;
- ret->free = 0;
- list_add(&ret->list, &first_block.list);
- log_output(LOG_DEBUG, "Alloc'd block of size %d", sz);
- return ret;
-}
-
-static void _free_block(mem_block_t *block, int hard) {
- if (hard == 1) {
- list_del(&block->list);
- log_output(LOG_DEBUG, "Freed block of size %d", block->sz);
- free(block);
- return;
- }
- block->free = 1;
-}
-
-void* rune_alloc(size_t sz) {
- if (sz == 0)
- return NULL;
-
- mem_block_t *block = _find_free_block(sz);
- if (block != NULL) {
- block->free = 0;
- return block->ptr;
- }
-
- block = _alloc_block(sz);
- return block->ptr;
-}
-
-void* rune_calloc(size_t nmemb, size_t sz) {
- if (sz == 0)
- return NULL;
-
- mem_block_t *block = _find_free_block(sz);
- if (block != NULL) {
- block->free = 0;
- return block->ptr;
- }
-
- block = _alloc_block(sz);
- memset(block->ptr, 0, sz);
- return block->ptr;
-}
-
-void* rune_realloc(void *ptr, size_t sz) {
- if (ptr == NULL || sz == 0)
- return rune_alloc(sz);
-
- mem_block_t *old = _find_block(ptr);
- mem_block_t *new = _alloc_block(sz);
- memcpy(new->ptr, old->ptr, old->sz);
- old->free = 1;
- return new->ptr;
-}
-
-void rune_free(void *ptr) {
- if (ptr == NULL)
- return;
-
- mem_block_t *block = _find_block(ptr);
- if (block->free == 1)
- return;
- block->free = 1;
-}
-
-void rune_free_all(void) {
- list_head_t *temp = &first_block.list;
- mem_block_t *block;
- while (temp != NULL) {
- block = (mem_block_t*)((void*)temp - offsetof(mem_block_t, list));
- if (block->ptr == DEADBLOCK) {
- temp = temp->next;
- continue;
- }
-
- temp = temp->next;
- if (block->ptr != NULL)
- _free_block(block, 1);
- }
-}