Ruby 4.1.0dev (2026-03-20 revision eb04ab9117336f2b3613244cfe8a528c52faf6d6)
pm_arena.h
Go to the documentation of this file.
1
6#ifndef PRISM_ARENA_H
7#define PRISM_ARENA_H
8
9#include "prism/defines.h"
10
11#include <stddef.h>
12#include <stdio.h>
13#include <stdlib.h>
14#include <string.h>
15
20typedef struct pm_arena_block {
23
25 size_t capacity;
26
28 size_t used;
29
33
39typedef struct {
42
46
55void pm_arena_reserve(pm_arena_t *arena, size_t capacity);
56
65void * pm_arena_alloc_slow(pm_arena_t *arena, size_t size);
66
79static PRISM_FORCE_INLINE void *
80pm_arena_alloc(pm_arena_t *arena, size_t size, size_t alignment) {
81 if (arena->current != NULL) {
82 size_t used_aligned = (arena->current->used + alignment - 1) & ~(alignment - 1);
83 size_t needed = used_aligned + size;
84
85 if (used_aligned >= arena->current->used && needed >= used_aligned && needed <= arena->current->capacity) {
86 arena->current->used = needed;
87 return arena->current->data + used_aligned;
88 }
89 }
90
91 return pm_arena_alloc_slow(arena, size);
92}
93
103static inline void *
104pm_arena_zalloc(pm_arena_t *arena, size_t size, size_t alignment) {
105 void *ptr = pm_arena_alloc(arena, size, alignment);
106 memset(ptr, 0, size);
107 return ptr;
108}
109
120static inline void *
121pm_arena_memdup(pm_arena_t *arena, const void *src, size_t size, size_t alignment) {
122 void *dst = pm_arena_alloc(arena, size, alignment);
123 memcpy(dst, src, size);
124 return dst;
125}
126
134
135#endif
void pm_arena_reserve(pm_arena_t *arena, size_t capacity)
Ensure the arena has at least capacity bytes available in its current block, allocating a new block i...
Definition pm_arena.c:63
struct pm_arena_block pm_arena_block_t
A single block of memory in the arena.
void * pm_arena_alloc_slow(pm_arena_t *arena, size_t size)
Slow path for pm_arena_alloc: allocate a new block and return a pointer to the first size bytes.
Definition pm_arena.c:74
static void * pm_arena_memdup(pm_arena_t *arena, const void *src, size_t size, size_t alignment)
Allocate memory from the arena and copy the given data into it.
Definition pm_arena.h:121
static PRISM_FORCE_INLINE void * pm_arena_alloc(pm_arena_t *arena, size_t size, size_t alignment)
Allocate memory from the arena.
Definition pm_arena.h:80
PRISM_EXPORTED_FUNCTION void pm_arena_free(pm_arena_t *arena)
Free all blocks in the arena.
Definition pm_arena.c:84
static void * pm_arena_zalloc(pm_arena_t *arena, size_t size, size_t alignment)
Allocate zero-initialized memory from the arena.
Definition pm_arena.h:104
Macro definitions used throughout the prism library.
#define PRISM_FORCE_INLINE
Force a function to be inlined at every call site.
Definition defines.h:99
#define PM_FLEX_ARY_LEN
A macro for defining a flexible array member.
Definition defines.h:341
#define PRISM_EXPORTED_FUNCTION
By default, we compile with -fvisibility=hidden.
Definition defines.h:53
A single block of memory in the arena.
Definition pm_arena.h:20
struct pm_arena_block * prev
The previous block in the chain (for freeing).
Definition pm_arena.h:22
char data[PM_FLEX_ARY_LEN]
The block's data.
Definition pm_arena.h:31
size_t used
The number of bytes consumed so far.
Definition pm_arena.h:28
size_t capacity
The total usable bytes in data[].
Definition pm_arena.h:25
A bump allocator.
Definition pm_arena.h:39
size_t block_count
The number of blocks allocated.
Definition pm_arena.h:44
pm_arena_block_t * current
The active block (allocate from here).
Definition pm_arena.h:41