eigsol_gpu/src/base/base_memory.h
2024-10-09 09:23:43 +02:00

62 lines
1.8 KiB
C

/* date = April 20th 2023 9:43 pm */
#ifndef BASE_MEMORY_H
#define BASE_MEMORY_H
#if !defined(ARENA_COMMIT_GRANULARITY)
#define ARENA_COMMIT_GRANULARITY Kilobytes(4)
#endif
#if !defined(ARENA_DECOMMIT_THRESHOLD)
#define ARENA_DECOMMIT_THRESHOLD Megabytes(64)
#endif
#if !defined(M_DEFAULT_RESERVE_SIZE)
#define M_DEFAULT_RESERVE_SIZE Megabytes(512)
#endif
#if !defined(M_COMMIT_BLOCK_SIZE)
#define M_COMMIT_BLOCK_SIZE Megabytes(64)
#endif
// We store this information in the header of the allocated memory for the arena!!!
typedef struct Arena Arena;
struct Arena {
U64 pos;
U64 commit_pos;
U64 capacity;
U64 align;
};
typedef struct ArenaTemp ArenaTemp;
struct ArenaTemp {
Arena *arena;
U64 pos;
};
root_function void m_change_memory_noop(void *ptr, U64 size);
root_function Arena* m_make_arena_reserve(U64 reserve_size);
root_function Arena* m_make_arena();
root_function void m_arena_release(Arena *arena);
root_function void* m_arena_push(Arena *arena, U64 size);
root_function void m_arena_pop_to(Arena *arena, U64 pos);
root_function void m_arena_pop(Arena* arena, U64 size);
root_function void m_arena_align(Arena *arena, U64 pow2_alignment);
root_function void* m_arena_push_zero(Arena *arena, U64 size);
root_function void m_arena_clear(Arena *arena);
#define PushArray(arena, type, count) (type *)m_arena_push((arena), sizeof(type)*(count))
#define PushArrayZero(arena, type, count) (type *)m_arena_push_zero((arena), sizeof(type)*(count))
//~ temp arena
root_function ArenaTemp m_arena_temp_begin(Arena *arena);
root_function void m_arena_temp_end(ArenaTemp temp);
// TODO(anton): Not sure when I should use this?
#define ArenaTempBlock(arena, name) ArenaTemp name = { 0 }; DeferLoop(name = m_arena_temp_begin(arena), m_arena_temp_end(name))
#endif //BASE_MEMORY_H