Minor updates

This commit is contained in:
Nils O. Selåsdal
2026-06-07 20:07:58 +02:00
parent c31aff806d
commit 83805e64c0
6 changed files with 63 additions and 27 deletions
+1 -1
View File
@@ -1,3 +1,3 @@
#!/bin/sh #!/bin/sh
set -x set -x
clang-19 -pipe -fsanitize=address -ggdb -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -std=gnu23 $CFLAGS src/*c clang-19 -DDEBUG -pipe -fsanitize=address -ggdb -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -std=gnu23 $CFLAGS src/*c
-14
View File
@@ -13,13 +13,8 @@ Arena *arena_alloc(const ArenaParams *params)
Assert(params->size > ARENA_HEADER_SZ); Assert(params->size > ARENA_HEADER_SZ);
Assert(params->size < (U32_Max - ARENA_HEADER_SZ - 1)); Assert(params->size < (U32_Max - ARENA_HEADER_SZ - 1));
// Note: only backend now is malloc
void *base; void *base;
if (params->flags & ArenaFlag_UseMalloc){
base = platform_malloc(params->size);
} else {
base = memory_allocate(params->size); base = memory_allocate(params->size);
}
Assert(base != NULL); Assert(base != NULL);
ASAN_UNPOISON_MEMORY_REGION(base, ARENA_HEADER_SZ); ASAN_UNPOISON_MEMORY_REGION(base, ARENA_HEADER_SZ);
@@ -43,11 +38,7 @@ void arena_free(Arena *arena)
while (it != NULL) { while (it != NULL) {
Arena *prev = it->prev; Arena *prev = it->prev;
if (it->flags & ArenaFlag_UseMalloc){
platform_free(it->base);
} else {
memory_free(it->base, it->size); memory_free(it->base, it->size);
}
it = prev; it = prev;
} }
} }
@@ -98,12 +89,7 @@ void arena_pop_to(Arena *arena, U32 abs_pos)
if (current->base_pos >= abs_pos) { if (current->base_pos >= abs_pos) {
ASAN_UNPOISON_MEMORY_REGION(current->base, current->size); // needed as we use malloc ASAN_UNPOISON_MEMORY_REGION(current->base, current->size); // needed as we use malloc
if (current->flags & ArenaFlag_UseMalloc){
platform_free(current->base);
} else {
memory_free(current->base, current->size); memory_free(current->base, current->size);
}
arena->current = prev; arena->current = prev;
} else { } else {
U32 new_pos = abs_pos - current->base_pos; U32 new_pos = abs_pos - current->base_pos;
+1 -4
View File
@@ -2,10 +2,7 @@
#include "base_core.h" #include "base_core.h"
typedef U32 ArenaFlags; typedef U32 ArenaFlags; // no flags defined yets
enum {
ArenaFlag_UseMalloc = (1 << 0),
};
typedef struct ArenaParams ArenaParams; typedef struct ArenaParams ArenaParams;
struct ArenaParams { struct ArenaParams {
-1
View File
@@ -43,7 +43,6 @@ static void arena_test_2(void)
{ {
ArenaParams arena_params = {}; ArenaParams arena_params = {};
arena_params.size = 1024+ARENA_HEADER_SZ; arena_params.size = 1024+ARENA_HEADER_SZ;
arena_params.flags = ArenaFlag_UseMalloc;
Arena *arena = arena_alloc(&arena_params); Arena *arena = arena_alloc(&arena_params);
void *ptr; void *ptr;
+56 -4
View File
@@ -1,8 +1,31 @@
#include "base_core.h" #include "base_core.h"
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include <sys/mman.h> #include <sys/mman.h>
U32 platform_page_size(void)
{
return getpagesize();
}
static INLINE size_t AlignToPageSize(size_t sz)
{
U32 page_size = platform_page_size();
size_t aligned_sz = AlignUpPow2(sz, page_size);
return aligned_sz;
}
static INLINE size_t AlignToPageStart(size_t sz)
{
U32 page_size = platform_page_size();
size_t aligned_sz = AlignDownPow2(sz, page_size);
return aligned_sz;
}
void *platform_malloc(size_t sz) void *platform_malloc(size_t sz)
{ {
return malloc(sz); return malloc(sz);
@@ -16,10 +39,13 @@ void platform_free(void *mem)
void *memory_allocate(size_t sz) void *memory_allocate(size_t sz)
{ {
int page_size = getpagesize(); if (sz == 0) {
size_t aligned_sz = AlignUpPow2(sz, page_size); sz = 1;
}
size_t aligned_sz = AlignToPageSize(sz);
void *mem = mmap(0, aligned_sz, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); void *mem = mmap(0, aligned_sz, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
TRACEF("memory_allocate size=%zu aligned_size=%zu mem=%p\n", sz, aligned_sz, mem);
if (mem == MAP_FAILED) { if (mem == MAP_FAILED) {
mem = NULL; mem = NULL;
} }
@@ -28,10 +54,36 @@ void *memory_allocate(size_t sz)
void memory_free(void *mem, size_t sz) void memory_free(void *mem, size_t sz)
{ {
int page_size = getpagesize(); size_t aligned_sz = AlignToPageSize(sz);
size_t aligned_sz = AlignUpPow2(sz, page_size); TRACEF(" memory_free size=%zu aligned_size=%zu mem=%p\n", sz, aligned_sz, mem);
int rc = munmap(mem, aligned_sz); int rc = munmap(mem, aligned_sz);
Assert(rc == 0); Assert(rc == 0);
} }
void memory_commit(void *mem, size_t sz)
{
size_t aligned_sz = AlignToPageSize(sz);
void *aligned_mem = (void *)AlignToPageStart((uintptr_t)mem);
TRACEF("memory_commit size=%zu aligned_size=%zu ptr=%p aligned_mem=%p\n", sz, aligned_sz, mem, aligned_mem);
int rc;
rc = mprotect(aligned_mem, aligned_sz, PROT_READ | PROT_WRITE);
Assert(rc == 0);
rc = madvise(aligned_mem, aligned_sz, MADV_WILLNEED);
Assert(rc == 0);
}
void memory_decommit(void *mem, size_t sz)
{
size_t aligned_sz = AlignToPageSize(sz);
void *aligned_mem = (void *)AlignToPageStart((uintptr_t)mem);
TRACEF("memory_commit size=%zu aligned_size=%zu ptr=%p aligned_mem=%p\n", sz, aligned_sz, mem, aligned_mem);
int rc;
rc = mprotect(aligned_mem, aligned_sz, PROT_NONE);
Assert(rc == 0);
rc = madvise(aligned_mem, aligned_sz, MADV_DONTNEED);
Assert(rc == 0);
}
+2
View File
@@ -3,6 +3,8 @@
void *platform_malloc(size_t sz); void *platform_malloc(size_t sz);
void platform_free(void *mem); void platform_free(void *mem);
U32 platform_page_size(void);
void *memory_allocate(size_t sz); void *memory_allocate(size_t sz);
void *memory_free(void *mem, size_t sz); void *memory_free(void *mem, size_t sz);