diff options
Diffstat (limited to 'arena-malloc.c')
-rw-r--r-- | arena-malloc.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/arena-malloc.c b/arena-malloc.c new file mode 100644 index 0000000..4246047 --- /dev/null +++ b/arena-malloc.c @@ -0,0 +1,61 @@ +#include <assert.h> +#include <stdio.h> +#include <stddef.h> +#include <string.h> +#include <stdlib.h> +#include <stdint.h> + +struct arena { + void *buffer; + size_t offset; + size_t size; +}; + +void arena_create(struct arena *arena) +{ + unsigned long const init_size = 10ul * 1024ul * 1024ul; + *arena = (struct arena){ + .buffer = malloc(init_size), + .size = init_size, + }; +} + +void arena_destroy(struct arena *arena) +{ + free(arena->buffer); + *arena = (struct arena){0}; +} + +size_t arena_add(struct arena *arena, void const *data, size_t const size) +{ + size_t const offset = arena->offset; + if (size + offset > arena->size) { + arena->size = (size + offset) * 1.5; + arena->buffer = realloc(arena->buffer, arena->size); + assert(arena->buffer); + } + if (data) { + memcpy(arena->buffer + offset, data, size); + } + arena->offset += size; + return offset; +} + +static inline void *arena_get(struct arena const *arena, size_t offset) +{ + return arena->buffer + offset; +} + +int main(int argc, char * const argv[]) +{ + (void)argc; + (void)argv; + struct arena arena; + arena_create(&arena); + unsigned data[4] = {1u, 2u, 3u, 4u}; + for (size_t i = 0; i < 50000000lu; i++) { + size_t const offset = arena_add(&arena, data, sizeof(data)); + data[0] = (uintptr_t)arena_get(&arena, offset); + } + arena_destroy(&arena); +} |