Aprelius logo
uptime: 00:00:00

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}