|
// Written by retoor@molodetz.nl
|
|
|
|
// This code provides a simple memory arena implementation, which allows dynamic memory allocation within a predefined size. It includes
|
|
// functions for constructing a new arena, allocating memory within the arena, resetting, and freeing the arena.
|
|
|
|
// The code utilizes rmalloc and rfree for custom memory allocation, which are likely part of another library not defined within the
|
|
// standard C library.
|
|
|
|
// MIT License
|
|
|
|
#ifndef RARENA_H
|
|
#define RARENA_H
|
|
|
|
#include "rmalloc.h"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
typedef struct arena_t {
|
|
unsigned char *memory;
|
|
unsigned int pointer;
|
|
unsigned int size;
|
|
} arena_t;
|
|
|
|
arena_t *arena_construct() {
|
|
arena_t *arena = (arena_t *)rmalloc(sizeof(arena_t));
|
|
arena->memory = NULL;
|
|
arena->pointer = 0;
|
|
arena->size = 0;
|
|
return arena;
|
|
}
|
|
|
|
arena_t *arena_new(size_t size) {
|
|
arena_t *arena = arena_construct();
|
|
arena->memory = (unsigned char *)rmalloc(size);
|
|
arena->size = size;
|
|
return arena;
|
|
}
|
|
|
|
void *arena_alloc(arena_t *arena, size_t size) {
|
|
if (arena->pointer + size > arena->size) {
|
|
return NULL;
|
|
}
|
|
void *p = arena->memory + arena->pointer;
|
|
arena->pointer += size;
|
|
return p;
|
|
}
|
|
|
|
void arena_free(arena_t *arena) {
|
|
if (arena->memory) {
|
|
rfree(arena->memory);
|
|
}
|
|
rfree(arena);
|
|
}
|
|
|
|
void arena_reset(arena_t *arena) { arena->pointer = 0; }
|
|
|
|
#endif |