Definitions for arena memory management.
This commit is contained in:
parent
367057174d
commit
e7e2829a63
58
src/base/base_arena.h
Normal file
58
src/base/base_arena.h
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#ifndef BASE_ARENA_H
|
||||||
|
#define BASE_ARENA_H
|
||||||
|
|
||||||
|
// Constants
|
||||||
|
#define ARENA_HEADER_SIZE 64
|
||||||
|
|
||||||
|
// Types
|
||||||
|
typedef u32 ArenaFlags;
|
||||||
|
enum { ArenaFlag_NoChain = (1 << 0); ArenaFlag_LargePages = (1 << 1); };
|
||||||
|
|
||||||
|
typedef struct ArenaParams ArenaParams;
|
||||||
|
struct ArenaParams {
|
||||||
|
ArenaFlags flags;
|
||||||
|
u64 reserve_size;
|
||||||
|
u64 commite_size;
|
||||||
|
void *optional_backing_buffer; // NOTE(tijani): ??
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct Arena Arena;
|
||||||
|
struct Arena {
|
||||||
|
Arena *previous; // Previous arena in the chain
|
||||||
|
Arena *current; // Current arena in the chain
|
||||||
|
ArenaFlags flags;
|
||||||
|
u32 commit_size;
|
||||||
|
u64 reserve_size;
|
||||||
|
u64 base_position;
|
||||||
|
u64 position;
|
||||||
|
u64 commit;
|
||||||
|
u64 reserve;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct Temp Temp;
|
||||||
|
struct Temp {
|
||||||
|
Arena *arena;
|
||||||
|
u64 position;
|
||||||
|
};
|
||||||
|
|
||||||
|
// creation, destruction
|
||||||
|
internal Arena *arena_alloc_(ArenaParams *params);
|
||||||
|
#define arena_alloc(...) arena_alloc_(&(ArenaParams){.reserve_size = MB(64), .commit_size = KB(64), __VA_ARGS__})
|
||||||
|
internal void arena_releas(Arena *arena);
|
||||||
|
|
||||||
|
// push, pop operations
|
||||||
|
internal void *arena_psuh(Arena *arena, u64 size, u64 align);
|
||||||
|
internal u64 arena_position(Arena *arena);
|
||||||
|
internal void arena_pop_to(Arena *arena, u64 position);
|
||||||
|
internal void arena_clear(Arena *arena);
|
||||||
|
internal void arena_pop(Arena *arena, u64 amount);
|
||||||
|
#define push_array_no_zero_aligned(a, T, c, align) (T *)arena_push((a), sizeof(T) * (c), (align))
|
||||||
|
#define push_array_aligned(a, T, c, align) (T *)MemoryZero(push_array_no_zero_aligned(a, T, c, align), sizeof(T) * (c))
|
||||||
|
#define push_array_no_zero(a, T, c) push_array_no_zero_aligned(a, T, c, Max(8, Align_Of(T)))
|
||||||
|
#define push_array(a, T, c) push_array_aligned(a, T, c, Max(8, Align_Of(T)))
|
||||||
|
|
||||||
|
// Temp
|
||||||
|
internal Temp temp_begin(Arena *arena);
|
||||||
|
internal void temp_end(Temp temp);
|
||||||
|
|
||||||
|
#endif // BASE_ARENA_H
|
Loading…
Reference in New Issue
Block a user