summaryrefslogtreecommitdiffstats
path: root/base/base_arena_unix.h
blob: 6d0ed0ddd456e7ebe00e9426f7ec8da806afacc4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#ifndef BASE_ARENA_UNIX_H
#define BASE_ARENA_UNIX_H

internal MemArena *
_arena_create(u64 capacity)
{
 MemArena *arena = (MemArena *)mmap(
 /* kernel decides where to throw the arena */
 NULL,
 capacity + sizeof(MemArena),
 PROT_READ | PROT_WRITE,
 MAP_SHARED | MAP_ANONYMOUS,
 -1,
 0);

 if(arena == MAP_FAILED)
  return NULL;

 arena->capacity          = capacity;
 arena->base_position     = (u8 *)arena + sizeof(MemArena);
 arena->current_position  = 0;
 arena->previous_position = 0;

 return arena;
}

internal void
_arena_destroy(MemArena *arena)
{
 if(!arena)
  return;
 munmap(arena, arena->capacity + sizeof(MemArena));
}

#endif /* BASE_ARENA_UNIX_H */