Minor updates
This commit is contained in:
@@ -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
|
||||||
|
|||||||
+3
-17
@@ -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 = memory_allocate(params->size);
|
||||||
base = platform_malloc(params->size);
|
|
||||||
} else {
|
|
||||||
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){
|
memory_free(it->base, it->size);
|
||||||
platform_free(it->base);
|
|
||||||
} else {
|
|
||||||
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){
|
memory_free(current->base, current->size);
|
||||||
platform_free(current->base);
|
|
||||||
} else {
|
|
||||||
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
@@ -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 {
|
||||||
|
|||||||
@@ -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
@@ -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);
|
||||||
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user