diff --git a/standalone_libraries/arena.c b/standalone_libraries/arena.c index 0e86afa..8b86ded 100644 --- a/standalone_libraries/arena.c +++ b/standalone_libraries/arena.c @@ -40,6 +40,12 @@ MA_API void MA_MemoryCopy(void *dst, void *src, size_t size) { #define ASAN_UNPOISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size)) #endif +MA_THREAD_LOCAL MA_SourceLoc MA_SavedSourceLoc; +MA_API void MA_SaveSourceLocEx(const char *file, int line) { + MA_SavedSourceLoc.file = file; + MA_SavedSourceLoc.line = line; +} + MA_API size_t MA_GetAlignOffset(size_t size, size_t align) { size_t mask = align - 1; size_t val = size & mask; @@ -110,7 +116,7 @@ MA_API uint8_t *MA_GetTop(MA_Arena *a) { return a->memory.data + a->len; } -MA_API void *MA_PushSizeNonZeroed(MA_Arena *a, size_t size) { +MA_API void *MA__PushSizeNonZeroed(MA_Arena *a, size_t size) { size_t align_offset = a->alignment ? MA_GetAlignOffset((uintptr_t)a->memory.data + (uintptr_t)a->len, a->alignment) : 0; size_t aligned_len = a->len + align_offset; size_t size_with_alignment = size + align_offset; @@ -124,23 +130,46 @@ MA_API void *MA_PushSizeNonZeroed(MA_Arena *a, size_t size) { #endif } bool result = MV_Commit(&a->memory, size_with_alignment + MA_COMMIT_ADD_SIZE); - MA_Assertf(result, "Failed to commit memory more memory! reserve: %zu commit: %zu len: %zu size_with_alignment: %zu", a->memory.reserve, a->memory.commit, a->len, size_with_alignment); + MA_Assertf(result, "%s(%d): Failed to commit memory more memory! reserve: %zu commit: %zu len: %zu size_with_alignment: %zu", MA_SavedSourceLoc.file, MA_SavedSourceLoc.line, a->memory.reserve, a->memory.commit, a->len, size_with_alignment); (void)result; } uint8_t *result = a->memory.data + aligned_len; a->len += size_with_alignment; - MA_Assertf(a->len <= a->memory.commit, "Reached commit boundary! reserve: %zu commit: %zu len: %zu base_len: %zu alignment: %d size_with_alignment: %zu", a->memory.reserve, a->memory.commit, a->len, a->base_len, a->alignment, size_with_alignment); + MA_Assertf(a->len <= a->memory.commit, "%s(%d): Reached commit boundary! reserve: %zu commit: %zu len: %zu base_len: %zu alignment: %d size_with_alignment: %zu", MA_SavedSourceLoc.file, MA_SavedSourceLoc.line, a->memory.reserve, a->memory.commit, a->len, a->base_len, a->alignment, size_with_alignment); ASAN_UNPOISON_MEMORY_REGION(result, size); return (void *)result; } -MA_API void *MA_PushSize(MA_Arena *arena, size_t size) { - void *result = MA_PushSizeNonZeroed(arena, size); +MA_API void *MA__PushSize(MA_Arena *arena, size_t size) { + void *result = MA__PushSizeNonZeroed(arena, size); MA_MemoryZero(result, size); return result; } +MA_API char *MA__PushStringCopy(MA_Arena *arena, char *p, size_t size) { + char *copy_buffer = (char *)MA__PushSizeNonZeroed(arena, size + 1); + MA_MemoryCopy(copy_buffer, p, size); + copy_buffer[size] = 0; + return copy_buffer; +} + +MA_API void *MA__PushCopy(MA_Arena *arena, void *p, size_t size) { + void *copy_buffer = MA__PushSizeNonZeroed(arena, size); + MA_MemoryCopy(copy_buffer, p, size); + return copy_buffer; +} + +MA_API MA_Arena MA_PushArena(MA_Arena *arena, size_t size) { + MA_Arena result; + MA_MemoryZero(&result, sizeof(result)); + result.memory.data = MA_PushArrayNonZeroed(arena, uint8_t, size); + result.memory.commit = size; + result.memory.reserve = size; + result.alignment = arena->alignment; + return result; +} + MA_API void MA_InitEx(MA_Arena *a, size_t reserve) { a->memory = MV_Reserve(reserve); ASAN_POISON_MEMORY_REGION(a->memory.data, a->memory.reserve); @@ -194,19 +223,6 @@ MA_API MA_Arena MA_Create() { return arena; } -MA_API char *MA_PushStringCopy(MA_Arena *arena, char *p, size_t size) { - char *copy_buffer = (char *)MA_PushSizeNonZeroed(arena, size + 1); - MA_MemoryCopy(copy_buffer, p, size); - copy_buffer[size] = 0; - return copy_buffer; -} - -MA_API void *MA_PushCopy(MA_Arena *arena, void *p, size_t size) { - void *copy_buffer = MA_PushSizeNonZeroed(arena, size); - MA_MemoryCopy(copy_buffer, p, size); - return copy_buffer; -} - MA_API bool MA_IsPointerInside(MA_Arena *arena, void *p) { uintptr_t pointer = (uintptr_t)p; uintptr_t start = (uintptr_t)arena->memory.data; @@ -215,16 +231,6 @@ MA_API bool MA_IsPointerInside(MA_Arena *arena, void *p) { return result; } -MA_API MA_Arena MA_PushArena(MA_Arena *arena, size_t size) { - MA_Arena result; - MA_MemoryZero(&result, sizeof(result)); - result.memory.data = MA_PushArrayNonZeroed(arena, uint8_t, size); - result.memory.commit = size; - result.memory.reserve = size; - result.alignment = arena->alignment; - return result; -} - MA_API MA_Checkpoint MA_Save(MA_Arena *arena) { MA_Checkpoint result; result.pos = arena->len; @@ -283,11 +289,11 @@ MA_StaticFunc void *M_ClibAllocatorProc(void *allocator, M_AllocatorOp kind, voi MA_API void *MA_AllocatorProc(void *allocator, M_AllocatorOp kind, void *p, size_t size, size_t old_size) { if (kind == M_AllocatorOp_Allocate) { - return MA_PushSizeNonZeroed((MA_Arena *)allocator, size); + return MA__PushSizeNonZeroed((MA_Arena *)allocator, size); } else if (kind == M_AllocatorOp_Reallocate) { - void *new_p = MA_PushSizeNonZeroed((MA_Arena *)allocator, size); + void *new_p = MA__PushSizeNonZeroed((MA_Arena *)allocator, size); MA_MemoryCopy(new_p, p, old_size); return new_p; } @@ -305,7 +311,7 @@ MA_API void *MA_ExclusiveAllocatorProc(void *allocator, M_AllocatorOp kind, void if (kind == M_AllocatorOp_Reallocate) { if (size > old_size) { size_t size_to_push = size - old_size; - void *result = MA_PushSizeNonZeroed(arena, size_to_push); + void *result = MA__PushSizeNonZeroed(arena, size_to_push); if (!p) p = result; return p; } diff --git a/standalone_libraries/arena.h b/standalone_libraries/arena.h index 94ec8ae..fe1a2ae 100644 --- a/standalone_libraries/arena.h +++ b/standalone_libraries/arena.h @@ -13,6 +13,7 @@ typedef struct MV_Memory MV_Memory; typedef struct MA_Checkpoint MA_Checkpoint; typedef struct MA_Arena MA_Arena; typedef struct M_Allocator M_Allocator; +typedef struct MA_SourceLoc MA_SourceLoc; #ifndef MA_DEFAULT_RESERVE_SIZE #define MA_DEFAULT_RESERVE_SIZE MA_GIB(1) @@ -93,15 +94,30 @@ struct MA_Checkpoint { size_t pos; }; -#define MA_PushArrayNonZeroed(a, T, c) (T *)MA_PushSizeNonZeroed(a, sizeof(T) * (c)) -#define MA_PushStructNonZeroed(a, T) (T *)MA_PushSizeNonZeroed(a, sizeof(T)) -#define MA_PushStruct(a, T) (T *)MA_PushSize(a, sizeof(T)) -#define MA_PushArray(a, T, c) (T *)MA_PushSize(a, sizeof(T) * (c)) -#define MA_PushStructCopy(a, T, p) (T *)MA_PushCopy(a, (p), sizeof(T)) +struct MA_SourceLoc { + const char *file; + int line; +}; + +extern MA_THREAD_LOCAL MA_SourceLoc MA_SavedSourceLoc; +#define MA_SaveSourceLoc() MA_SaveSourceLocEx(__FILE__, __LINE__) +MA_API void MA_SaveSourceLocEx(const char *file, int line); + +#define MA_PushSize(a, size) (MA_SaveSourceLoc(), MA__PushSize(a, size)) +#define MA_PushSizeNonZeroed(a, size) (MA_SaveSourceLoc(), MA__PushSizeNonZeroed(a, size)) +#define MA_PushCopy(a, p, size) (MA_SaveSourceLoc(), MA__PushCopy(a, p, size)) +#define MA_PushStringCopy(a, p, size) (MA_SaveSourceLoc(), MA__PushStringCopy(a, p, size)) +#define MA_PushArrayNonZeroed(a, T, c) (T *)MA__PushSizeNonZeroed(a, sizeof(T) * (c)) +#define MA_PushStructNonZeroed(a, T) (T *)MA__PushSizeNonZeroed(a, sizeof(T)) +#define MA_PushStruct(a, T) (T *)MA__PushSize(a, sizeof(T)) +#define MA_PushArray(a, T, c) (T *)MA__PushSize(a, sizeof(T) * (c)) +#define MA_PushStructCopy(a, T, p) (T *)MA__PushCopy(a, (p), sizeof(T)) #define MA_CheckpointScope(name, InArena) for (MA_Checkpoint name = MA_Save(InArena); name.arena; (MA_Load(name), name.arena = 0)) #define M_AllocStruct(a, T) (T *)M_Alloc((a), sizeof(T)) #define M_AllocArray(a, T, c) (T *)M_Alloc((a), sizeof(T) * (c)) +#define M_AllocStructNonZeroed(a, T) (T *)M_AllocNonZeroed((a), sizeof(T)) +#define M_AllocArrayNonZeroed(a, T, c) (T *)M_AllocNonZeroed((a), sizeof(T) * (c)) #define M_AllocStructCopy(a, T, p) (T *)M_PushCopy(a, (p), sizeof(T)) #define MA_IS_POW2(x) (((x) & ((x)-1)) == 0) @@ -124,10 +140,10 @@ MA_API MA_Arena * MA_Bootstrap(void); MA_API M_Allocator MA_BootstrapExclusive(void); MA_API MA_Arena MA_PushArena(MA_Arena *arena, size_t size); -MA_API void * MA_PushSizeNonZeroed(MA_Arena *a, size_t size); -MA_API void * MA_PushSize(MA_Arena *arena, size_t size); -MA_API char * MA_PushStringCopy(MA_Arena *arena, char *p, size_t size); -MA_API void * MA_PushCopy(MA_Arena *arena, void *p, size_t size); +MA_API void * MA__PushSizeNonZeroed(MA_Arena *a, size_t size); +MA_API void * MA__PushSize(MA_Arena *arena, size_t size); +MA_API char * MA__PushStringCopy(MA_Arena *arena, char *p, size_t size); +MA_API void * MA__PushCopy(MA_Arena *arena, void *p, size_t size); MA_API MA_Checkpoint MA_Save(MA_Arena *arena); MA_API void MA_Load(MA_Checkpoint checkpoint); diff --git a/tests/test_main.cpp b/tests/test_main.cpp index 10945e1..541b6af 100644 --- a/tests/test_main.cpp +++ b/tests/test_main.cpp @@ -20,6 +20,7 @@ int main() { TestBootstrapExclusive(); TestBootstrapArenaClear(); + // @todo: github worker fails on this: // TestClexer(); // Unicode iteration over codepoints using For