orca/src/util/memory.h

115 lines
3.1 KiB
C

/************************************************************//**
*
* @file: memory.h
* @author: Martin Fouilleul
* @date: 24/10/2019
* @revision:
*
*****************************************************************/
#ifndef __MEMORY_H_
#define __MEMORY_H_
#include"util/typedefs.h"
#include"util/lists.h"
#include"platform/platform_memory.h"
#ifdef __cplusplus
extern "C" {
#endif
//--------------------------------------------------------------------------------
//NOTE(martin): memory arena
//--------------------------------------------------------------------------------
typedef struct mem_arena_chunk
{
list_elt listElt;
char* ptr;
u64 offset;
u64 committed;
u64 cap;
} mem_arena_chunk;
typedef struct mem_arena
{
mem_base_allocator* base;
list_info chunks;
mem_arena_chunk* currentChunk;
} mem_arena;
typedef struct mem_arena_scope
{
mem_arena* arena;
mem_arena_chunk* chunk;
u64 offset;
} mem_arena_scope;
typedef struct mem_arena_options
{
mem_base_allocator* base;
u64 reserve;
} mem_arena_options;
MP_API void mem_arena_init(mem_arena* arena);
MP_API void mem_arena_init_with_options(mem_arena* arena, mem_arena_options* options);
MP_API void mem_arena_release(mem_arena* arena);
MP_API void* mem_arena_alloc(mem_arena* arena, u64 size);
MP_API void mem_arena_clear(mem_arena* arena);
MP_API mem_arena_scope mem_arena_scope_begin(mem_arena* arena);
MP_API void mem_arena_scope_end(mem_arena_scope scope);
#define mem_arena_alloc_type(arena, type) ((type*)mem_arena_alloc(arena, sizeof(type)))
#define mem_arena_alloc_array(arena, type, count) ((type*)mem_arena_alloc(arena, sizeof(type)*(count)))
//--------------------------------------------------------------------------------
//NOTE(martin): memory pool
//--------------------------------------------------------------------------------
//TODO: we could probably remove pool. Most of the time we construct pool on top of
// arenas "manually" with different free lists per object types...
typedef struct mem_pool
{
mem_arena arena;
list_info freeList;
u64 blockSize;
} mem_pool;
typedef struct mem_pool_options
{
mem_base_allocator* base;
u64 reserve;
} mem_pool_options;
MP_API void mem_pool_init(mem_pool* pool, u64 blockSize);
MP_API void mem_pool_init_with_options(mem_pool* pool, u64 blockSize, mem_pool_options* options);
MP_API void mem_pool_release(mem_pool* pool);
MP_API void* mem_pool_alloc(mem_pool* pool);
MP_API void mem_pool_recycle(mem_pool* pool, void* ptr);
MP_API void mem_pool_clear(mem_pool* pool);
#define mem_pool_alloc_type(arena, type) ((type*)mem_pool_alloc(arena))
//--------------------------------------------------------------------------------
//NOTE(martin): per-thread implicit scratch arena
//--------------------------------------------------------------------------------
MP_API mem_arena* mem_scratch();
MP_API mem_arena* mem_scratch_next(mem_arena* used);
MP_API mem_arena_scope mem_scratch_begin();
MP_API mem_arena_scope mem_scratch_begin_next(mem_arena* used);
#define mem_scratch_end(scope) mem_arena_scope_end(scope)
#ifdef __cplusplus
} // extern "C"
#endif
#endif //__MEMORY_H_