@@ -24,7 +24,7 @@ static size_t
2424pm_arena_next_block_size (const pm_arena_t * arena , size_t min_size ) {
2525 size_t size = PM_ARENA_INITIAL_SIZE ;
2626
27- for (size_t i = PM_ARENA_GROWTH_INTERVAL ; i <= arena -> block_count ; i += PM_ARENA_GROWTH_INTERVAL ) {
27+ for (size_t exp = PM_ARENA_GROWTH_INTERVAL ; exp <= arena -> block_count ; exp += PM_ARENA_GROWTH_INTERVAL ) {
2828 if (size < PM_ARENA_MAX_SIZE ) size *= 2 ;
2929 }
3030
@@ -36,7 +36,7 @@ pm_arena_next_block_size(const pm_arena_t *arena, size_t min_size) {
3636 * into the arena, and return it. Aborts on allocation failure.
3737 */
3838static pm_arena_block_t *
39- pm_arena_new_block (pm_arena_t * arena , size_t data_size , size_t initial_used ) {
39+ pm_arena_block_new (pm_arena_t * arena , size_t data_size , size_t initial_used ) {
4040 assert (initial_used <= data_size );
4141 pm_arena_block_t * block = (pm_arena_block_t * ) xmalloc (PM_ARENA_BLOCK_SIZE (data_size ));
4242
6363pm_arena_reserve (pm_arena_t * arena , size_t capacity ) {
6464 if (capacity <= PM_ARENA_INITIAL_SIZE ) return ;
6565 if (arena -> current != NULL && (arena -> current -> capacity - arena -> current -> used ) >= capacity ) return ;
66-
67- pm_arena_new_block (arena , capacity , 0 );
66+ pm_arena_block_new (arena , capacity , 0 );
6867}
6968
7069/**
71- * Allocate memory from the arena. The returned memory is NOT zeroed. This
72- * function is infallible — it aborts on allocation failure .
70+ * Slow path for pm_arena_alloc: allocate a new block and return a pointer to
71+ * the first `size` bytes. Called when the current block has insufficient space .
7372 */
7473void *
75- pm_arena_alloc (pm_arena_t * arena , size_t size , size_t alignment ) {
76- // Try current block.
77- if (arena -> current != NULL ) {
78- size_t used_aligned = (arena -> current -> used + alignment - 1 ) & ~(alignment - 1 );
79- size_t needed = used_aligned + size ;
80-
81- // Guard against overflow in the alignment or size arithmetic.
82- if (used_aligned >= arena -> current -> used && needed >= used_aligned && needed <= arena -> current -> capacity ) {
83- arena -> current -> used = needed ;
84- return arena -> current -> data + used_aligned ;
85- }
86- }
87-
88- // Allocate new block via xmalloc — memory is NOT zeroed.
89- // New blocks from xmalloc are max-aligned, so data[] starts aligned for
90- // any C type. No padding needed at the start.
74+ pm_arena_alloc_slow (pm_arena_t * arena , size_t size ) {
9175 size_t block_data_size = pm_arena_next_block_size (arena , size );
92- pm_arena_block_t * block = pm_arena_new_block (arena , block_data_size , size );
93-
76+ pm_arena_block_t * block = pm_arena_block_new (arena , block_data_size , size );
9477 return block -> data ;
9578}
9679
97- /**
98- * Allocate zero-initialized memory from the arena. This function is infallible
99- * — it aborts on allocation failure.
100- */
101- void *
102- pm_arena_zalloc (pm_arena_t * arena , size_t size , size_t alignment ) {
103- void * ptr = pm_arena_alloc (arena , size , alignment );
104- memset (ptr , 0 , size );
105- return ptr ;
106- }
107-
108- /**
109- * Allocate memory from the arena and copy the given data into it.
110- */
111- void *
112- pm_arena_memdup (pm_arena_t * arena , const void * src , size_t size , size_t alignment ) {
113- void * dst = pm_arena_alloc (arena , size , alignment );
114- memcpy (dst , src , size );
115- return dst ;
116- }
117-
11880/**
11981 * Free all blocks in the arena.
12082 */
0 commit comments