1#include "prism/internal/arena.h"
3#include "prism/internal/allocator.h"
13#define PM_ARENA_BLOCK_SIZE(data_size) (offsetof(pm_arena_block_t, data) + (data_size))
16#define PM_ARENA_INITIAL_SIZE 8192
19#define PM_ARENA_GROWTH_INTERVAL 8
22#define PM_ARENA_MAX_SIZE (1024 * 1024)
28pm_arena_next_block_size(
const pm_arena_t *arena,
size_t min_size) {
29 size_t size = PM_ARENA_INITIAL_SIZE;
31 for (
size_t exp = PM_ARENA_GROWTH_INTERVAL; exp <= arena->block_count; exp += PM_ARENA_GROWTH_INTERVAL) {
32 if (size < PM_ARENA_MAX_SIZE) size *= 2;
35 return size > min_size ? size : min_size;
43pm_arena_block_new(
pm_arena_t *arena,
size_t data_size,
size_t initial_used) {
44 assert(initial_used <= data_size);
48 fprintf(stderr,
"prism: out of memory; aborting\n");
52 block->capacity = data_size;
53 block->used = initial_used;
54 block->prev = arena->current;
55 arena->current = block;
67pm_arena_reserve(
pm_arena_t *arena,
size_t capacity) {
68 if (capacity <= PM_ARENA_INITIAL_SIZE)
return;
69 if (arena->current != NULL && (arena->current->capacity - arena->current->used) >= capacity)
return;
70 pm_arena_block_new(arena, capacity, 0);
78pm_arena_alloc_slow(
pm_arena_t *arena,
size_t size) {
79 size_t block_data_size = pm_arena_next_block_size(arena, size);
90 if (arena == NULL) abort();
101 while (block != NULL) {
103 xfree_sized(block, PM_ARENA_BLOCK_SIZE(block->capacity));
115 pm_arena_cleanup(arena);
#define xmalloc
Old name of ruby_xmalloc.
#define xcalloc
Old name of ruby_xcalloc.