Web/reactor/arena.c
2025-09-15 12:57:54 -05:00

67 lines
1.3 KiB
C

#include "arena.h"
#include <stdlib.h>
#include <string.h>
// arena_new creates a new arena with the specified size.
arena_t* arena_new(size_t size) {
arena_t *a = malloc(sizeof(arena_t));
if (!a) return NULL;
a->buf = malloc(size);
if (!a->buf) {
free(a);
return NULL;
}
a->size = size;
a->used = 0;
a->next = NULL;
return a;
}
// arena_free destroys the arena and its buffer.
void arena_free(arena_t *a) {
if (!a) return;
// Free chained arenas if any
arena_t *next;
while (a) {
next = a->next;
free(a->buf);
free(a);
a = next;
}
}
// arena_alloc allocates memory from the arena.
void* arena_alloc(arena_t *a, size_t size) {
// Align to 8 bytes for proper alignment
size = (size + 7) & ~7;
if (a->used + size > a->size) {
// Could implement arena chaining here
// For now, just fail
return NULL;
}
void *ptr = a->buf + a->used;
a->used += size;
return ptr;
}
// arena_strdup duplicates a string into the arena.
char* arena_strdup(arena_t *a, const char *s, size_t len) {
char *copy = arena_alloc(a, len + 1);
if (!copy) return NULL;
memcpy(copy, s, len);
copy[len] = '\0';
return copy;
}
// arena_reset resets the arena for reuse.
void arena_reset(arena_t *a) {
a->used = 0;
// Could reset chained arenas here if implemented
}