summaryrefslogtreecommitdiff
path: root/arena-malloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'arena-malloc.c')
-rw-r--r--arena-malloc.c61
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);
+}