source file
arena.c
Full source referenced by a note. Click a line number to copy its URL.
arena.cc
1#include <stddef.h>2#include <stdio.h>3#include <sys/mman.h>4 5#define ARENA_SIZE (1024 * 1024)6 7typedef struct {8 char *start;9 char *end;10 char *cursor;11} Arena;12 13Arena g_arena;14 15void *arena_alloc(size_t size) {16 if (g_arena.end - g_arena.cursor < size)17 return NULL;18 19 void *ptr = g_arena.cursor;20 g_arena.cursor += size;21 return ptr;22}23 24void arena_reset(void) { g_arena.cursor = g_arena.start; }25 26int main() {27 void *mem = mmap(NULL, ARENA_SIZE, PROT_READ | PROT_WRITE,28 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);29 30 if (mem == MAP_FAILED) {31 return -1;32 }33 34 g_arena.start = mem;35 g_arena.cursor = mem;36 g_arena.end = mem + ARENA_SIZE;37 38 char *a = arena_alloc(48);39 char *b = arena_alloc(256);40 char *c = arena_alloc(96);41 char *d = arena_alloc(512);42 char *e = arena_alloc(160);43 char *f = arena_alloc(384);44 45 printf("a: %p (48 bytes)\n", (void *)a);46 printf("b: %p (256 bytes)\n", (void *)b);47 printf("c: %p (96 bytes)\n", (void *)c);48 printf("d: %p (512 bytes)\n", (void *)d);49 printf("e: %p (160 bytes)\n", (void *)e);50 printf("f: %p (384 bytes)\n", (void *)f);51 52 printf("\nbytes used: %ld\n", g_arena.cursor - g_arena.start);53 54 arena_reset();55 printf("bytes used after arena_reset(): %ld\n", g_arena.cursor - g_arena.start);56 57 munmap(mem, ARENA_SIZE);58 59 return 0;60}