Kestrel Interface
Loading...
Searching...
No Matches
kest_bump_arena.c
Go to the documentation of this file.
1#include "kest_int.h"
2
3#ifndef PRINTLINES_ALLOWED
4#define PRINTLINES_ALLOWED 0
5#endif
6
7static const char *FNAME = "kest_bump_arena.c";
8
10{
11 if (!arena)
12 return ERR_NULL_PTR;
13
14 arena->arena = NULL;
15 arena->pos = 0;
16 arena->capacity = 0;
17
18 return NO_ERROR;
19}
20
21static void *kest_bump_arena_alloc_wrapper(void *data, size_t size)
22{
23 return kest_bump_arena_alloc((kest_bump_arena*)data, size);
24}
25
26static void *kest_bump_arena_realloc_wrapper(void *data, void *ptr, size_t size)
27{
28 return kest_bump_arena_realloc((kest_bump_arena*)data, ptr, size);
29}
30
31static void kest_bump_arena_free_wrapper(void *data, void *ptr)
32{
33 (void)data;
34 (void)ptr;
35 /* no-op */
36}
37
38int kest_bump_arena_init(kest_bump_arena *arena, size_t capacity)
39{
40 if (!arena)
41 return ERR_NULL_PTR;
42
43 size_t align = KEST_BUMP_ARENA_INIT_ALIGN;
44 arena->base_ua = kest_alloc(capacity + align - 1);
45
46 if (!arena->base_ua)
47 {
48 arena->pos = 0;
49 arena->arena = NULL;
50 arena->capacity = 0;
51 return ERR_ALLOC_FAIL;
52 }
53
54 uintptr_t addr = (uintptr_t)arena->base_ua;
55 uintptr_t aligned = (addr + (align - 1)) & ~(uintptr_t)(align - 1);
56
57 arena->arena = (void*)aligned;
58 arena->pos = 0;
59 arena->capacity = capacity;
60
61 arena->alloc.alloc = kest_bump_arena_alloc_wrapper;
62 arena->alloc.realloc = kest_bump_arena_realloc_wrapper;
63 arena->alloc.free = kest_bump_arena_free_wrapper;
64 arena->alloc.data = arena;
65
66 return NO_ERROR;
67}
68
69void *kest_bump_arena_alloc(kest_bump_arena *arena, size_t size)
70{
71 if (!arena)
72 {
73 return NULL;
74 }
75
76 if (!arena->arena || arena->capacity == 0)
77 {
78 KEST_PRINTF("kest_bump_arena ERROR: arena has no memory!\n");
79 return NULL;
80 }
81
82 if (size == 0)
83 return NULL;
84
85 size = (size + (KEST_BUMP_ARENA_ALLOC_ALIGN - 1)) & ~(KEST_BUMP_ARENA_ALLOC_ALIGN - 1);
86
87 if (size > arena->capacity - arena->pos)
88 {
89 KEST_PRINTF("kest_bump_arena ERROR: Arena exhausted. Capacity: %d bytes; consumed: %d bytes. Requested: %d bytes\n",
90 arena->capacity, arena->pos, size);
91 return NULL;
92 }
93
94 uint8_t *ptr = (uint8_t*)arena->arena + arena->pos;
95 arena->pos += size;
96
97 return ptr;
98}
99
100void *kest_bump_arena_realloc(kest_bump_arena *arena, void *p, size_t size)
101{
102 if (!arena)
103 {
104 return NULL;
105 }
106
107 if (!p)
108 return kest_bump_arena_alloc(arena, size);
109
110 uint8_t *new_ptr = kest_bump_arena_alloc(arena, size);
111
112 if (!new_ptr)
113 return NULL;
114
115 memcpy(new_ptr, p, size);
116
117 return new_ptr;
118}
119
121{
122 if (!arena)
123 return ERR_NULL_PTR;
124
125 arena->pos = 0;
126
127 return NO_ERROR;
128}
129
131{
132 if (!arena)
133 return ERR_NULL_PTR;
134
135 if (!arena->base_ua)
136 {
137 arena->capacity = 0;
138 arena->arena = NULL;
139 arena->pos = 0;
140 return NO_ERROR;
141 }
142
143 kest_free(arena->base_ua);
144 arena->base_ua = NULL;
145 arena->arena = NULL;
146 arena->capacity = 0;
147 arena->pos = 0;
148
149 return NO_ERROR;
150}
void kest_free(void *ptr)
Definition kest_alloc.c:32
void * kest_alloc(size_t size)
Definition kest_alloc.c:11
int kest_bump_arena_init_empty(kest_bump_arena *arena)
int kest_bump_arena_reset(kest_bump_arena *arena)
int kest_bump_arena_init(kest_bump_arena *arena, size_t capacity)
void * kest_bump_arena_realloc(kest_bump_arena *arena, void *p, size_t size)
void * kest_bump_arena_alloc(kest_bump_arena *arena, size_t size)
int kest_bump_arena_destroy(kest_bump_arena *arena)
#define KEST_BUMP_ARENA_ALLOC_ALIGN
#define KEST_BUMP_ARENA_INIT_ALIGN
#define ERR_ALLOC_FAIL
#define NO_ERROR
#define ERR_NULL_PTR
#define KEST_PRINTF(...)
Definition kest_printf.h:10
void *(* alloc)(void *data, size_t)
Definition kest_alloc.h:7
void *(* realloc)(void *data, void *, size_t)
Definition kest_alloc.h:8
void(* free)(void *data, void *)
Definition kest_alloc.h:9
kest_allocator alloc