16 #define _PSDebug(...) fprintf(stderr, "arena: " __VA_ARGS__)
20#define NUSED __attribute__((unused))
27 _PSDebug(
"Invalid arena domain: %d\n", domain);
28 ps_exit(EXIT_FAILURE);
34 MAP_ANON | MAP_PRIVATE, -1, 0);
35 mprotect(arena->start, arena->page_size, PROT_READ | PROT_WRITE);
36 if (arena->start == MAP_FAILED) {
37 _PSDebug(
"mmap: %s\n", strerror(errno));
38 ps_exit(EXIT_FAILURE);
41 _PSDebug(
"Arena initialized at %p with %llu bytes\n", arena->start,
48 _PSDebug(
"Invalid arena domain: %d\n", domain);
49 ps_exit(EXIT_FAILURE);
58 _PSDebug(
"Arena was destroyed using %lu out of %llu bytes\n", arena->offset,
62#define _PS_ARENA_ALLOCATE(arena, n) \
64 if (arena->offset + n >= PS_INITIAL_ARENA_MMAP) { \
65 _PSDebug("Exhausted arena virtual memory\n%s", ""); \
69 if ((arena->offset & (arena->page_size - 1)) > 0) { \
70 const size_t new_size = (arena->offset + arena->page_size - 1) \
71 & -(arena->page_size); \
72 mprotect(arena->start, new_size, PROT_READ | PROT_WRITE); \
78 n = (n + 15ULL) & -16ULL;
87 _PSDebug(
"New arena object %p (%llu bytes) in %s at %s:%zu\n", ptr, n, func,
88 basename(file), line);
96 memcpy(new_str, str,
length);
Defines assertion and abortion functionality.
#define CHECK(...)
All code inside CHECK will be run when PS_DEBUG is defined.
char * arena_strndup(enum ps_arena_domain arena, const char *str, size_t length)
void ps_arena_open(enum ps_arena_domain domain)
Initializes the given arena for allocation.
void * ps_arena_allocate_debug(enum ps_arena_domain domain, size_t n, const char *file NUSED, const char *func NUSED, size_t line NUSED)
void * ps_arena_allocate(enum ps_arena_domain domain, size_t n)
void ps_arena_close(enum ps_arena_domain domain)
Destroys any allocated objects in the given arena.
#define _PS_ARENA_ALLOCATE(arena, n)
struct ps_arena_allocator arenas[__PS_ARENA_COUNT]
Defines an arena allocator for the compiler.
#define arena_alloc(arena, n)
#define PS_INITIAL_ARENA_MMAP
An allocation of 16MB per arena.