From 8f85b33696f0cafa2d03ec5442b7dc2a5dbd25c3 Mon Sep 17 00:00:00 2001 From: Randy Jordan Date: Sat, 6 Jun 2026 18:22:23 -0500 Subject: [PATCH] Replaced arena --- include/platform/mem/ci2_arena.h | 50 ++++++++------------ src/ci2_arena.c | 81 +++++++++++++++++--------------- 2 files changed, 62 insertions(+), 69 deletions(-) diff --git a/include/platform/mem/ci2_arena.h b/include/platform/mem/ci2_arena.h index 9579da1..27a616d 100644 --- a/include/platform/mem/ci2_arena.h +++ b/include/platform/mem/ci2_arena.h @@ -1,5 +1,5 @@ /* - | Copyright | ------------------------------------------------------------ - Copyright (c) 2026 Randy Jordan + Copyright (c) 2026 Randy Jordan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -23,45 +23,33 @@ SOFTWARE. #ifndef CI2_ARENA_H #define CI2_ARENA_H -#include "../ci2_platform.h" -#include "../error/ci2_exception.h" - -enum -{ - DEFAULT = 0, /* default: fail-handler (throws) + zero */ - SOFT_FAIL = 1u << 0, /* on failure return NULL */ - HARD_FAIL = 1u << 1, /* on failure call abort() */ - NO_ZERO = 1u << 2, /* do not zero memory on success */ -}; +#include struct Arena { - char* beg; - char* end; + char* beg; + char* end; }; typedef struct Arena Arena; -/* Forward definition of an exception */ -CI2_API struct Exception arena_oom; +/* Initialize an Arena with an existing buffer */ +extern void +arena_back(struct Arena* a, char* buf, ptrdiff_t len); -/* Initialize an Arena from a buffer. */ -CI2_API void -arena_init(struct Arena* a, void* buf, ptrdiff_t len); - -/* Dynamically allocate an Arena */ -CI2_API struct Arena +/* Allocate a new Arena */ +extern struct Arena arena_new(ptrdiff_t cap); -/* Get the remaining capicity of an arena. */ -CI2_API ptrdiff_t -arena_size(struct Arena a); +/* Get the current capacity of an Arena */ +extern ptrdiff_t +arena_capacity(struct Arena a); -/* Make an allocation from an Arena. */ -CI2_API void* -arena_alloc(struct Arena* a, - int flags, - ptrdiff_t size, - ptrdiff_t align, - ptrdiff_t count); +/* Make an allocation from an Arena and do not zero.*/ +extern void* +arena_malloc(struct Arena* a, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count); + +/* Make an allocation from an Arena and zero.*/ +extern void* +arena_calloc(struct Arena* a, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count); #endif // ci2_arena.h diff --git a/src/ci2_arena.c b/src/ci2_arena.c index 5f317bf..ed3ae87 100644 --- a/src/ci2_arena.c +++ b/src/ci2_arena.c @@ -1,5 +1,5 @@ /* - | Copyright | ------------------------------------------------------------ - Copyright (c) 2026 Randy Jordan + Copyright (c) 2026 Randy Jordan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -21,60 +21,65 @@ SOFTWARE. * --------------------------------------------------------------------------*/ #include "../include/platform/mem/ci2_arena.h" -#include +#include +#include #include -struct Exception arena_oom = {"Arena is out of memory!"}; +#include -/* Initialize an Arena from a buffer. */ +/* Initialize an Arena with an existing buffer */ void -arena_init(struct Arena* a, void* buf, ptrdiff_t len) +arena_back(struct Arena* a, char* buf, ptrdiff_t len) { - CI2_ASSERT(buf != NULL); - CI2_ASSERT(len > 0); - a->beg = (char*)buf; - a->end = (char*)buf + len; + assert(a != NULL); + assert(buf != NULL); + a->beg = buf; + a->end = buf + len; } -/* Dynamically allocate an Arena */ +/* Allocate a new Arena */ struct Arena arena_new(ptrdiff_t cap) { - struct Arena a = { 0 }; - a.beg = malloc(cap); - a.end = a.beg ? a.beg + cap : 0; - return a; + struct Arena a = { 0 }; + a.beg = malloc(cap); + a.end = a.beg ? a.beg + cap : 0; + return a; } -/* Get the remaining capicity of an arena. */ +/* Get the current capacity of an Arena */ ptrdiff_t -arena_size(struct Arena a) +arena_capacity(struct Arena a) { - ptrdiff_t res = a.end - a.beg; - return res; + ptrdiff_t res = a.end - a.beg; + return res; } -/* Make an allocation from an Arena. */ +/* Make an allocation from an Arena and do not zero.*/ void* -arena_alloc(struct Arena* a, - int flags, - ptrdiff_t size, - ptrdiff_t align, - ptrdiff_t count) +arena_calloc(struct Arena* a, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count) { - ptrdiff_t padding = -(uintptr_t)a->beg & (align - 1); - ptrdiff_t available = a->end - a->beg - padding; - if (available < 0 || count > available / size) { - if (flags & SOFT_FAIL) - return 0; - - if (flags & HARD_FAIL) - CI2_DEBUG_TRAP(); - - CI2_RAISE(arena_oom); - } - void* p = a->beg + padding; - ptrdiff_t total = padding + count * size; + ptrdiff_t padding = -(uintptr_t)a->beg & (align - 1); + ptrdiff_t available = a->end - a->beg - padding; + if (available < 0 || count > available / size) { + return NULL; + } + ptrdiff_t total = padding + count * size; + void* p = a->beg + total; a->beg += total; - return flags & NO_ZERO ? p : memset(p, 0, total); + return memset(p, 0, total); } +/* Make an allocation from an Arena and zero.*/ +void* +arena_malloc(struct Arena* a, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count) +{ + ptrdiff_t padding = -(uintptr_t)a->beg & (align - 1); + ptrdiff_t available = a->end - a->beg - padding; + if (available < 0 || count > available / size) { + return NULL; + } + ptrdiff_t total = padding + count * size; + void* p = a->beg + total; + a->beg += total; + return p; +}