Compare commits

...

2 Commits

4 changed files with 25 additions and 6 deletions

View File

@ -21,7 +21,8 @@ struct arena {
// PUBLIC API // PUBLIC API
bool wapp_mem_arena_init(Arena **arena, u64 base_capacity) { bool wapp_mem_arena_init(Arena **arena, u64 base_capacity, MemAllocFlags flags,
bool zero_buffer) {
if (!arena || *arena || base_capacity == 0) { if (!arena || *arena || base_capacity == 0) {
return false; return false;
} }
@ -36,7 +37,10 @@ bool wapp_mem_arena_init(Arena **arena, u64 base_capacity) {
? base_capacity ? base_capacity
: ARENA_MINIMUM_CAPACITY; : ARENA_MINIMUM_CAPACITY;
arena_ptr->buf = (u8 *)calloc(arena_capacity, sizeof(u8)); arena_ptr->buf = (u8 *)wapp_mem_util_alloc(
arena_capacity, WAPP_MEM_ACCESS_READ_WRITE, flags,
zero_buffer ? WAPP_MEM_INIT_INITIALISED : WAPP_MEM_INIT_UNINITIALISED);
if (!(arena_ptr->buf)) { if (!(arena_ptr->buf)) {
wapp_mem_arena_destroy(arena); wapp_mem_arena_destroy(arena);
return false; return false;
@ -87,7 +91,7 @@ void wapp_mem_arena_destroy(Arena **arena) {
Arena *arena_ptr = *arena; Arena *arena_ptr = *arena;
if (arena_ptr->buf) { if (arena_ptr->buf) {
free(arena_ptr->buf); wapp_mem_util_free(arena_ptr->buf, arena_ptr->capacity);
} }
arena_ptr->buf = arena_ptr->offset = NULL; arena_ptr->buf = arena_ptr->offset = NULL;

View File

@ -2,6 +2,7 @@
#define MEM_ARENA_H #define MEM_ARENA_H
#include "aliases.h" #include "aliases.h"
#include "mem_utils.h"
#include <stdbool.h> #include <stdbool.h>
#ifdef __cplusplus #ifdef __cplusplus
@ -10,7 +11,8 @@ extern "C" {
typedef struct arena Arena; typedef struct arena Arena;
bool wapp_mem_arena_init(Arena **arena, u64 base_capacity); bool wapp_mem_arena_init(Arena **arena, u64 base_capacity, MemAllocFlags flags,
bool zero_buffer);
void *wapp_mem_arena_alloc(Arena *arena, u64 size); void *wapp_mem_arena_alloc(Arena *arena, u64 size);
void *wapp_mem_arena_alloc_aligned(Arena *arena, u64 size, u64 alignment); void *wapp_mem_arena_alloc_aligned(Arena *arena, u64 size, u64 alignment);
void wapp_mem_arena_clear(Arena *arena); void wapp_mem_arena_clear(Arena *arena);

View File

@ -65,6 +65,11 @@ void *wapp_mem_util_align_forward(void *ptr, u64 alignment) {
void *wapp_mem_util_alloc(u64 size, MemAccess access, MemAllocFlags flags, void *wapp_mem_util_alloc(u64 size, MemAccess access, MemAllocFlags flags,
MemInitType type) { MemInitType type) {
#if defined(WAPP_PLATFORM_WINDOWS) #if defined(WAPP_PLATFORM_WINDOWS)
// Ensure memory is committed if it's meant to be initialised
if (type == WAPP_MEM_INIT_INITIALISED) {
flags |= WAPP_MEM_ALLOC_COMMIT;
}
void *output = alloc_windows(size, access, flags); void *output = alloc_windows(size, access, flags);
#elif defined(WAPP_PLATFORM_POSIX) #elif defined(WAPP_PLATFORM_POSIX)
void *output = alloc_posix(size, access, flags); void *output = alloc_posix(size, access, flags);
@ -99,7 +104,8 @@ internal inline void *alloc_posix(u64 size, MemAccess access,
MemAllocFlags flags) { MemAllocFlags flags) {
i32 alloc_flags = flags | MAP_ANON | MAP_PRIVATE; i32 alloc_flags = flags | MAP_ANON | MAP_PRIVATE;
#ifdef WAPP_PLATFORM_LINUX #if defined(WAPP_PLATFORM_LINUX) || defined(WAPP_PLATFORM_GNU) || \
defined(WAPP_PLATFORM_NET_BSD)
alloc_flags |= MAP_NORESERVE; alloc_flags |= MAP_NORESERVE;
#endif #endif

View File

@ -30,9 +30,16 @@ typedef enum mem_alloc_flags {
#if defined(WAPP_PLATFORM_WINDOWS) #if defined(WAPP_PLATFORM_WINDOWS)
WAPP_MEM_ALLOC_RESERVE = MEM_RESERVE, WAPP_MEM_ALLOC_RESERVE = MEM_RESERVE,
WAPP_MEM_ALLOC_COMMIT = MEM_COMMIT, WAPP_MEM_ALLOC_COMMIT = MEM_COMMIT,
#elif defined(WAPP_PLATFORM_POSIX) #elif defined(WAPP_PLATFORM_LINUX) || defined(WAPP_PLATFORM_GNU)
WAPP_MEM_ALLOC_RESERVE = 0, WAPP_MEM_ALLOC_RESERVE = 0,
WAPP_MEM_ALLOC_COMMIT = MAP_POPULATE, WAPP_MEM_ALLOC_COMMIT = MAP_POPULATE,
#elif defined(WAPP_PLATFORM_FREE_BSD)
WAPP_MEM_ALLOC_RESERVE = 0,
WAPP_MEM_ALLOC_COMMIT = MAP_PREFAULT_READ,
#elif defined(WAPP_PLATFORM_BSD) || defined(WAPP_PLATFORM_UNIX) || \
defined(WAPP_PLATFORM_APPLE)
WAPP_MEM_ALLOC_RESERVE = 0,
WAPP_MEM_ALLOC_COMMIT = 0,
#endif #endif
} MemAllocFlags; } MemAllocFlags;