1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
#include "lrhi.h"
void *lrhi_allocator_allocate(struct lrhi_allocator *allocator,
ptrdiff_t size) {
return allocator->allocate(size, allocator->ctx);
}
void lrhi_allocator_free(struct lrhi_allocator *allocator, ptrdiff_t size,
void *ptr) {
allocator->free(ptr, size, allocator->ctx);
}
struct lrhi_arena {
unsigned char *data;
int allocated;
int capacity;
};
lrhi_arena *lrhi_arena_create(struct lrhi_allocator *allocator,
ptrdiff_t arena_size) {
lrhi_arena *arena = lrhi_allocator_allocate(allocator, sizeof(lrhi_arena));
arena->data = lrhi_allocator_allocate(allocator, arena_size);
arena->allocated = 0;
arena->capacity = arena_size;
return arena;
}
void lrhi_arena_destroy(struct lrhi_allocator *allocator, lrhi_arena *arena) {
lrhi_allocator_free(allocator, arena->capacity, arena->data);
lrhi_allocator_free(allocator, sizeof(lrhi_arena), arena);
}
void *lrhi_arena_allocate(lrhi_arena *arena, ptrdiff_t size) {
if (arena->allocated + size > arena->capacity) {
LRHI_PANIC("Arena is full, allocation failed");
}
unsigned char *ptr = arena->data + arena->allocated;
arena->allocated += size;
return ptr;
}
void lrhi_arena_reset(lrhi_arena *arena) { arena->allocated = 0; }
static void *arena_allocator_allocate(ptrdiff_t size, void *ctx) {
return lrhi_arena_allocate((lrhi_arena *)ctx, size);
}
static void arena_allocator_free(void *ptr, ptrdiff_t size, void *ctx) {
(void)ptr;
(void)size;
(void)ctx;
}
struct lrhi_allocator lrhi_arena_allocator(lrhi_arena *arena) {
return (struct lrhi_allocator){.allocate = arena_allocator_allocate,
.free = arena_allocator_free,
.ctx = arena};
}
|