'PushDry' -> 'ArenaNext'

This commit is contained in:
jacob 2025-11-07 18:30:18 -06:00
parent a94e62e023
commit d9b487cea2
12 changed files with 228 additions and 222 deletions

View File

@ -1,6 +1,8 @@
SharedArenaCtx shared_arena_ctx = ZI; SharedArenaCtx shared_arena_ctx = ZI;
/* NOTE: Application will exit if arena fails to reserve or commit initial memory. */ ////////////////////////////////////////////////////////////
//~ Arena management
Arena *AcquireArena(u64 reserve) Arena *AcquireArena(u64 reserve)
{ {
__prof; __prof;
@ -58,11 +60,46 @@ void ReleaseArena(Arena *arena)
ReleaseMemory(arena); ReleaseMemory(arena);
} }
/* NOTE: Application will exit if arena fails to commit memory */ /* Copy the memory from src to dst, replacing old contents.
* Dst will expand if necessary. */
void CopyArena(Arena *dst, Arena *src)
{
ResetArena(dst);
u64 data_size = src->pos;
u8 *data_src = ArenaFirst(src, u8);
u8 *data_dst = PushBytesNoZero(dst, data_size, 1);
CopyBytes(data_dst, data_src, data_size);
}
void ShrinkArena(Arena *arena)
{
/* Not implemented */
Assert(0);
LAX arena;
}
void SetArenaReadonly(Arena *arena)
{
SetMemoryReadonly(arena, arena->committed + ArenaHeaderSize);
}
void SetArenaReadWrite(Arena *arena)
{
SetMemoryReadWrite(arena, arena->committed + ArenaHeaderSize);
}
void *ResetArena(Arena *arena)
{
PopTo(arena, 0);
return ArenaFirst(arena, u8);
}
////////////////////////////////////////////////////////////
//~ Push / pop
void *PushBytesNoZero(Arena *arena, u64 size, u64 align) void *PushBytesNoZero(Arena *arena, u64 size, u64 align)
{ {
Assert(align > 0); Assert(align > 0);
Assert(!arena->readonly);
void *ptr = 0; void *ptr = 0;
u8 *base = ArenaFirst(arena, u8); u8 *base = ArenaFirst(arena, u8);
@ -111,36 +148,144 @@ void *PushBytesNoZero(Arena *arena, u64 size, u64 align)
return ptr; return ptr;
} }
/* Copies the memory from the source arena into the destination arena, void *PushBytes(Arena *arena, u64 size, u64 align)
* replacing old contents. Destination arena will be expanded if necessary. */
void CopyArena(Arena *dst, Arena *src)
{ {
ResetArena(dst); void *p = PushBytesNoZero(arena, size, align);
u64 data_size = src->pos; ZeroBytes(p, size);
u8 *data_src = ArenaFirst(src, u8); return p;
u8 *data_dst = PushBytesNoZero(dst, data_size, 1);
CopyBytes(data_dst, data_src, data_size);
} }
void ShrinkArena(Arena *arena) void *PushAlign(Arena *arena, u64 align)
{ {
/* Not implemented */ if (align > 0)
{
u64 aligned_start_pos = (arena->pos + (align - 1));
aligned_start_pos -= aligned_start_pos % align;
u64 align_bytes = aligned_start_pos - (u64)arena->pos;
if (align_bytes > 0)
{
return (void *)PushStructsNoZero(arena, u8, align_bytes);
}
else
{
return (void *)(ArenaFirst(arena, u8) + arena->pos);
}
}
else
{
/* 0 alignment */
Assert(0); Assert(0);
LAX arena; return (void *)(ArenaFirst(arena, u8) + arena->pos);
}
} }
void SetArenaReadonly(Arena *arena) void PopTo(Arena *arena, u64 pos)
{ {
#if RtcIsEnabled Assert(arena->pos >= pos);
arena->readonly = 1; AsanPoison(ArenaFirst(arena, u8) + pos, arena->pos - pos);
#endif arena->pos = pos;
SetMemoryReadonly(arena, arena->committed + ArenaHeaderSize);
} }
void SetArenaReadWrite(Arena *arena) void PopBytesNoCopy(Arena *arena, u64 size)
{ {
SetMemoryReadWrite(arena, arena->committed + ArenaHeaderSize); Assert(arena->pos >= size);
#if RtcIsEnabled u64 new_pos = arena->pos - size;
arena->readonly = 0; AsanPoison(ArenaFirst(arena, u8) + new_pos, arena->pos - new_pos);
#endif arena->pos = new_pos;
}
void PopBytes(Arena *arena, u64 size, void *copy_dst)
{
Assert(arena->pos >= size);
u64 new_pos = arena->pos - size;
void *src = (void *)(ArenaFirst(arena, u8) + new_pos);
CopyBytes(copy_dst, src, size);
AsanPoison(ArenaFirst(arena, u8) + new_pos, arena->pos - new_pos);
arena->pos = new_pos;
}
void *ArenaFirst_(Arena *arena, u64 align)
{
u64 aligned_start_pos = align - 1;
aligned_start_pos -= aligned_start_pos % align;
void *ptr = ((u8 *)arena + ArenaHeaderSize) + aligned_start_pos;
return ptr;
}
void *ArenaNext_(Arena *arena, u64 align)
{
u64 aligned_start_pos = (arena->pos + (align - 1));
aligned_start_pos -= aligned_start_pos % align;
void *ptr = ((u8 *)arena + ArenaHeaderSize) + aligned_start_pos;
return ptr;
}
////////////////////////////////////////////////////////////
//~ Temp arena helpers
TempArena BeginTempArena(Arena *arena)
{
TempArena t = ZI;
t.arena = arena;
t.start_pos = arena->pos;
return t;
}
void EndTempArena(TempArena temp)
{
PopTo(temp.arena, temp.start_pos);
}
////////////////////////////////////////////////////////////
//~ Fiber arena helpers
FiberArenaCtx *FiberArenaCtxFromId(i16 fiber_id)
{
SharedArenaCtx *g = &shared_arena_ctx;
FiberArenaCtx *ctx = &g->arena_contexts[fiber_id];
if (!ctx->perm_arena)
{
__profn("Initialize fiber arena ctx");
ctx->perm_arena = AcquireArena(Gibi(64));
for (i32 i = 0; i < (i32)countof(ctx->scratch_arenas); ++i)
{
ctx->scratch_arenas[i] = AcquireArena(Gibi(64));
}
}
return ctx;
}
////////////////////////////////////////////////////////////
//~ Scratch arena helpers
TempArena BeginScratch(Arena *potential_conflict)
{
/* This function is currently hard-coded to search through 2 scratch arenas */
StaticAssert(ScratchArenasPerCtx == 2);
/* Use `BeginScratchNoConflict` if no conflicts are present */
Assert(potential_conflict != 0);
FiberArenaCtx *ctx = FiberArenaCtxFromId(FiberId());
Arena *scratch_arena = ctx->scratch_arenas[0];
if (scratch_arena == potential_conflict)
{
scratch_arena = ctx->scratch_arenas[1];
}
TempArena temp = BeginTempArena(scratch_arena);
return temp;
}
TempArena BeginScratchNoConflict_(void)
{
FiberArenaCtx *ctx = FiberArenaCtxFromId(FiberId());
Arena *scratch_arena = ctx->scratch_arenas[0];
TempArena temp = BeginTempArena(scratch_arena);
return temp;
}
void EndScratch(TempArena scratch_temp)
{
EndTempArena(scratch_temp);
} }

View File

@ -9,19 +9,12 @@ Struct(Arena)
u64 pos; u64 pos;
u64 committed; u64 committed;
u64 reserved; u64 reserved;
#if RtcIsEnabled
b32 readonly;
#endif
}; };
Struct(TempArena) Struct(TempArena)
{ {
Arena *arena; Arena *arena;
u64 start_pos; u64 start_pos;
#if RtcIsEnabled
u64 scratch_id;
#endif
}; };
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
@ -41,7 +34,19 @@ Struct(SharedArenaCtx)
} extern shared_arena_ctx; } extern shared_arena_ctx;
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ Arena push/pop //~ Arena management
Arena *AcquireArena(u64 reserve);
void ReleaseArena(Arena *arena);
void CopyArena(Arena *dst, Arena *src);
void ShrinkArena(Arena *arena);
void SetArenaReadonly(Arena *arena);
void SetArenaReadWrite(Arena *arena);
void *ResetArena(Arena *arena);
////////////////////////////////////////////////////////////
//~ Push / pop
#define PushStructs(a, type, n) ((type *)PushBytes((a), (sizeof(type) * (n)), alignof(type))) #define PushStructs(a, type, n) ((type *)PushBytes((a), (sizeof(type) * (n)), alignof(type)))
#define PushStruct(a, type) PushStructs((a), type, 1) #define PushStruct(a, type) PushStructs((a), type, 1)
@ -55,190 +60,46 @@ Struct(SharedArenaCtx)
#define PopStructsNoCopy(a, type, n) PopBytesNoCopy((a), sizeof(type) * (n)) #define PopStructsNoCopy(a, type, n) PopBytesNoCopy((a), sizeof(type) * (n))
#define PopStructNoCopy(a, type) PopStructsNoCopy((a), type, 1) #define PopStructNoCopy(a, type) PopStructsNoCopy((a), type, 1)
#define ArenaFirst(arena, type) (type *)((u8 *)(arena) + ArenaHeaderSize) #define ArenaFirst(arena, type) (type *)ArenaFirst_((arena), alignof(type))
#define ArenaNext(arena, type) (type *)ArenaNext_((arena), alignof(type))
#define ArenaCount(arena, type) ((arena)->pos / sizeof(type)) #define ArenaCount(arena, type) ((arena)->pos / sizeof(type))
/* Returns a pointer to where the next push would be (at alignment of type).
* Equivalent to PushStruct but without actually allocating anything or modifying the arena. */
#define PushDry(a, type) (type *)(_PushDry((a), alignof(type)))
void *PushBytesNoZero(Arena *arena, u64 size, u64 align); void *PushBytesNoZero(Arena *arena, u64 size, u64 align);
void *PushBytes(Arena *arena, u64 size, u64 align);
void *PushAlign(Arena *arena, u64 align);
Inline void *PushBytes(Arena *arena, u64 size, u64 align) void PopTo(Arena *arena, u64 pos);
{ void PopBytesNoCopy(Arena *arena, u64 size);
void *p = PushBytesNoZero(arena, size, align); void PopBytes(Arena *arena, u64 size, void *copy_dst);
ZeroBytes(p, size);
return p;
}
Inline void PopTo(Arena *arena, u64 pos) void *ArenaNext_(Arena *arena, u64 align);
{ void *ArenaFirst_(Arena *arena, u64 align);
Assert(arena->pos >= pos);
Assert(!arena->readonly);
AsanPoison(ArenaFirst(arena, u8) + pos, arena->pos - pos);
arena->pos = pos;
}
Inline void PopBytesNoCopy(Arena *arena, u64 size)
{
Assert(arena->pos >= size);
Assert(!arena->readonly);
u64 new_pos = arena->pos - size;
AsanPoison(ArenaFirst(arena, u8) + new_pos, arena->pos - new_pos);
arena->pos = new_pos;
}
Inline void PopBytes(Arena *arena, u64 size, void *copy_dst)
{
Assert(arena->pos >= size);
Assert(!arena->readonly);
u64 new_pos = arena->pos - size;
void *src = (void *)(ArenaFirst(arena, u8) + new_pos);
CopyBytes(copy_dst, src, size);
AsanPoison(ArenaFirst(arena, u8) + new_pos, arena->pos - new_pos);
arena->pos = new_pos;
}
Inline void *_PushDry(Arena *arena, u64 align)
{
u64 aligned_start_pos = (arena->pos + (align - 1));
aligned_start_pos -= aligned_start_pos % align;
void *ptr = ArenaFirst(arena, u8) + aligned_start_pos;
return ptr;
}
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ Arena management //~ Temp arena helpers
Arena *AcquireArena(u64 reserve); TempArena BeginTempArena(Arena *arena);
void ReleaseArena(Arena *arena); void EndTempArena(TempArena temp);
void CopyArena(Arena *dst, Arena *src);
void ShrinkArena(Arena *arena);
void SetArenaReadonly(Arena *arena);
void SetArenaReadWrite(Arena *arena);
Inline void *PushAlign(Arena *arena, u64 align)
{
Assert(!arena->readonly);
if (align > 0)
{
u64 aligned_start_pos = (arena->pos + (align - 1));
aligned_start_pos -= aligned_start_pos % align;
u64 align_bytes = aligned_start_pos - (u64)arena->pos;
if (align_bytes > 0)
{
return (void *)PushStructsNoZero(arena, u8, align_bytes);
}
else
{
return (void *)(ArenaFirst(arena, u8) + arena->pos);
}
}
else
{
/* 0 alignment */
Assert(0);
return (void *)(ArenaFirst(arena, u8) + arena->pos);
}
}
Inline void *ResetArena(Arena *arena)
{
PopTo(arena, 0);
return ArenaFirst(arena, u8);
}
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ Temp arena operations //~ Fiber arena helpers
Inline TempArena BeginTempArena(Arena *arena)
{
TempArena t = ZI;
t.arena = arena;
t.start_pos = arena->pos;
return t;
}
Inline void EndTempArena(TempArena temp)
{
PopTo(temp.arena, temp.start_pos);
}
////////////////////////////////////////////////////////////
//~ Fiber arena ctx operations
Inline FiberArenaCtx *FiberArenaCtxFromId(i16 fiber_id)
{
SharedArenaCtx *g = &shared_arena_ctx;
FiberArenaCtx *ctx = &g->arena_contexts[fiber_id];
if (!ctx->perm_arena)
{
__profn("Initialize fiber arena ctx");
ctx->perm_arena = AcquireArena(Gibi(64));
for (i32 i = 0; i < (i32)countof(ctx->scratch_arenas); ++i)
{
ctx->scratch_arenas[i] = AcquireArena(Gibi(64));
}
}
return ctx;
}
FiberArenaCtx *FiberArenaCtxFromId(i16 fiber_id);
#define PermArena() (FiberArenaCtxFromId(FiberId())->perm_arena) #define PermArena() (FiberArenaCtxFromId(FiberId())->perm_arena)
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ Scratch helpers //~ Scratch arena helpers
/* Any parameterized arenas in the caller's scope should be passed into this TempArena BeginScratch(Arena *potential_conflict);
* function as a potential "conflict". This is to prevent friction in case the TempArena BeginScratchNoConflict_(void);
* passed arena is itself a scratch arena from another scope (since void EndScratch(TempArena scratch_temp);
* parameterized arenas are often used to allocate persistent results for the
* caller).
*
* Use `BeginScratchNoConflict` instead if there is no arena in the current
* scope that could potentially be a scratch arena from another scope. */
Inline TempArena BeginScratch(Arena *potential_conflict)
{
/* This function is currently hard-coded to search through 2 scratch arenas */
StaticAssert(ScratchArenasPerCtx == 2);
/* Use `BeginScratchNoConflict` if no conflicts are present */
Assert(potential_conflict != 0);
FiberArenaCtx *ctx = FiberArenaCtxFromId(FiberId());
Arena *scratch_arena = ctx->scratch_arenas[0];
if (scratch_arena == potential_conflict)
{
scratch_arena = ctx->scratch_arenas[1];
}
TempArena temp = BeginTempArena(scratch_arena);
return temp;
}
/* This macro declares an unused "arena" variable that will error if an existing "arena" /* This macro declares an unused "arena" variable that will error if an existing "arena"
* variable is present (due to shadowing). This is for catching obvious cases of * variable is present (due to shadowing). This is for catching obvious cases of
* `BeginScratchNoConflict` getting called when an `arena` variable already * `BeginScratchNoConflict` getting called when an `arena` variable already
* exists in the caller's scope (`BeginScratch(arena)` should be called * exists in the caller's scope. */
* instead). */
#define BeginScratchNoConflict() \ #define BeginScratchNoConflict() \
BeginScratchNoConflict_(); \ BeginScratchNoConflict_(); \
do { \ do { \
u8 arena = 0; \ u8 arena = 0; \
LAX arena; \
} while (0) } while (0)
Inline TempArena BeginScratchNoConflict_(void)
{
FiberArenaCtx *ctx = FiberArenaCtxFromId(FiberId());
Arena *scratch_arena = ctx->scratch_arenas[0];
TempArena temp = BeginTempArena(scratch_arena);
return temp;
}
Inline void EndScratch(TempArena scratch_temp)
{
EndTempArena(scratch_temp);
}

View File

@ -154,7 +154,7 @@ void FutexWakeNeq(void *addr)
if (first_id != 0) if (first_id != 0)
{ {
TempArena scratch = BeginScratchNoConflict(); TempArena scratch = BeginScratchNoConflict();
i16 *ids = PushDry(scratch.arena, i16); i16 *ids = ArenaNext(scratch.arena, i16);
i16 ids_count = 0; i16 ids_count = 0;
{ {
i16 id = first_id; i16 id = first_id;

View File

@ -23,7 +23,7 @@ String StringFromU64(Arena *arena, u64 n, u64 base, u64 zfill)
/* Build backwards text starting from least significant digit */ /* Build backwards text starting from least significant digit */
u64 len = 0; u64 len = 0;
u8 *backwards_text = PushDry(scratch.arena, u8); u8 *backwards_text = ArenaNext(scratch.arena, u8);
do do
{ {
StringFromChar(scratch.arena, IntChars[n % base]); StringFromChar(scratch.arena, IntChars[n % base]);
@ -56,7 +56,7 @@ String StringFromU64(Arena *arena, u64 n, u64 base, u64 zfill)
//- Signed int conversion //- Signed int conversion
String StringFromI64(Arena *arena, i64 n, u64 base, u64 zfill) String StringFromI64(Arena *arena, i64 n, u64 base, u64 zfill)
{ {
u8 *final_text = PushDry(arena, u8); u8 *final_text = ArenaNext(arena, u8);
u8 len = 0; u8 len = 0;
if (n < 0) if (n < 0)
{ {
@ -91,7 +91,7 @@ String StringFromF64(Arena *arena, f64 f, u32 precision)
{ {
TempArena scratch = BeginScratch(arena); TempArena scratch = BeginScratch(arena);
String result = ZI; String result = ZI;
result.text = PushDry(arena, u8); result.text = ArenaNext(arena, u8);
if (IsF32Nan(f)) if (IsF32Nan(f))
{ {
@ -123,7 +123,7 @@ String StringFromF64(Arena *arena, f64 f, u32 precision)
/* Print whole part */ /* Print whole part */
{ {
/* Build backwards text starting from least significant digit */ /* Build backwards text starting from least significant digit */
u8 *backwards_text = PushDry(scratch.arena, u8); u8 *backwards_text = ArenaNext(scratch.arena, u8);
u64 backwards_text_len = 0; u64 backwards_text_len = 0;
do do
{ {
@ -164,7 +164,7 @@ String StringFromF64(Arena *arena, f64 f, u32 precision)
String StringFromhandle(Arena *arena, u64 v0, u64 v1) String StringFromhandle(Arena *arena, u64 v0, u64 v1)
{ {
String result = ZI; String result = ZI;
result.text = PushDry(arena, u8); result.text = ArenaNext(arena, u8);
result.len += PushString(arena, Lit("h")).len; result.len += PushString(arena, Lit("h")).len;
result.len += StringFromU64(arena, v0, 16, 0).len; result.len += StringFromU64(arena, v0, 16, 0).len;
result.len += PushString(arena, Lit("x")).len; result.len += PushString(arena, Lit("x")).len;
@ -176,7 +176,7 @@ String StringFromhandle(Arena *arena, u64 v0, u64 v1)
String StringFromUid(Arena *arena, Uid uid) String StringFromUid(Arena *arena, Uid uid)
{ {
String result = ZI; String result = ZI;
result.text = PushDry(arena, u8); result.text = ArenaNext(arena, u8);
result.len += StringFromU64(arena, (uid.hi >> 32), 16, 8).len; result.len += StringFromU64(arena, (uid.hi >> 32), 16, 8).len;
return result; return result;
} }
@ -242,7 +242,7 @@ String CatString(Arena *arena, String str1, String str2)
StringArray SplitString(Arena *arena, String str, String delim) StringArray SplitString(Arena *arena, String str, String delim)
{ {
StringArray pieces = ZI; StringArray pieces = ZI;
pieces.strings = PushDry(arena, String); pieces.strings = ArenaNext(arena, String);
i64 piece_start = 0; i64 piece_start = 0;
for (i64 i = 0; i < (i64)str.len - (i64)delim.len; ++i) for (i64 i = 0; i < (i64)str.len - (i64)delim.len; ++i)
{ {
@ -284,7 +284,7 @@ String IndentString(Arena *arena, String str, u32 indent)
TempArena scratch = BeginScratch(arena); TempArena scratch = BeginScratch(arena);
u64 final_len = 0; u64 final_len = 0;
u8 *final_text = PushDry(arena, u8); u8 *final_text = ArenaNext(arena, u8);
StringArray split = SplitString(scratch.arena, str, Lit("\n")); StringArray split = SplitString(scratch.arena, str, Lit("\n"));
for (u64 i = 0; i < split.count; ++i) for (u64 i = 0; i < split.count; ++i)
@ -443,7 +443,7 @@ StringListNode *PushStringToList(Arena *arena, StringList *l, String s)
String StringFromList(Arena *arena, StringList l, String separator) String StringFromList(Arena *arena, StringList l, String separator)
{ {
String result = ZI; String result = ZI;
result.text = PushDry(arena, u8); result.text = ArenaNext(arena, u8);
for (StringListNode *n = l.first; n; n = n->next) for (StringListNode *n = l.first; n; n = n->next)
{ {
String s = n->s; String s = n->s;
@ -543,7 +543,7 @@ String FormatStringV(Arena *arena, String fmt, va_list args)
__prof; __prof;
u64 final_len = 0; u64 final_len = 0;
u8 *final_text = PushDry(arena, u8); u8 *final_text = ArenaNext(arena, u8);
u8 *end = fmt.text + fmt.len; u8 *end = fmt.text + fmt.len;
b32 no_more_args = 0; b32 no_more_args = 0;
@ -702,7 +702,7 @@ String StringFromString16(Arena *arena, String16 str16)
{ {
String result = { String result = {
.len = 0, .len = 0,
.text = PushDry(arena, u8) .text = ArenaNext(arena, u8)
}; };
u64 pos16 = 0; u64 pos16 = 0;
@ -727,7 +727,7 @@ String StringFromString32(Arena *arena, String32 str32)
{ {
String result = { String result = {
.len = 0, .len = 0,
.text = PushDry(arena, u8) .text = ArenaNext(arena, u8)
}; };
u64 pos32 = 0; u64 pos32 = 0;
@ -754,7 +754,7 @@ String16 String16FromString(Arena *arena, String str8)
{ {
String16 result = { String16 result = {
.len = 0, .len = 0,
.text = PushDry(arena, u16) .text = ArenaNext(arena, u16)
}; };
u64 pos8 = 0; u64 pos8 = 0;
@ -779,7 +779,7 @@ String32 String32FromString(Arena *arena, String str8)
{ {
String32 result = { String32 result = {
.len = 0, .len = 0,
.text = PushDry(arena, u32) .text = ArenaNext(arena, u32)
}; };
u64 pos8 = 0; u64 pos8 = 0;

View File

@ -132,7 +132,7 @@ String SwappedStateFromName(Arena *arena, String name)
if (handle != INVALID_HANDLE_VALUE) if (handle != INVALID_HANDLE_VALUE)
{ {
u32 chunk_size = Kibi(64); u32 chunk_size = Kibi(64);
result.text = PushDry(arena, u8); result.text = ArenaNext(arena, u8);
for (;;) for (;;)
{ {
u8 *chunk = PushStructsNoZero(arena, u8, chunk_size); u8 *chunk = PushStructsNoZero(arena, u8, chunk_size);

View File

@ -9,7 +9,7 @@ void InitLogSystem(String logfile_path)
W32_SharedLogState *g = &W32_shared_log_state; W32_SharedLogState *g = &W32_shared_log_state;
g->logs_arena = AcquireArena(Gibi(64)); g->logs_arena = AcquireArena(Gibi(64));
g->log_msgs_arena = AcquireArena(Gibi(64)); g->log_msgs_arena = AcquireArena(Gibi(64));
g->readable_log_events = PushDry(g->logs_arena, LogEvent); g->readable_log_events = ArenaNext(g->logs_arena, LogEvent);
if (logfile_path.len > 0) if (logfile_path.len > 0)
{ {
TempArena scratch = BeginScratchNoConflict(); TempArena scratch = BeginScratchNoConflict();

View File

@ -331,7 +331,7 @@ CLD_EpaData CLD_EpaDataFromShapes(CLD_Shape *shape0, CLD_Shape *shape1, Xform xf
if (gjk_result.overlapping) if (gjk_result.overlapping)
{ {
CLD_MenkowskiSimplex s = gjk_result.simplex; CLD_MenkowskiSimplex s = gjk_result.simplex;
proto = PushDry(scratch.arena, CLD_MenkowskiPoint); proto = ArenaNext(scratch.arena, CLD_MenkowskiPoint);
{ {
Assert(s.len == 3); Assert(s.len == 3);
CLD_MenkowskiPoint *tmp = PushStructsNoZero(scratch.arena, CLD_MenkowskiPoint, 3); CLD_MenkowskiPoint *tmp = PushStructsNoZero(scratch.arena, CLD_MenkowskiPoint, 3);
@ -990,7 +990,7 @@ f32 CLD_TimeOfImpact(CLD_Shape *c0, CLD_Shape *c1, Xform xf0_t0, Xform xf1_t0, X
/* TODO: Remove this (debugging) */ /* TODO: Remove this (debugging) */
Vec2Array CLD_Menkowski(Arena *arena, CLD_Shape *shape0, CLD_Shape *shape1, Xform xf0, Xform xf1, u32 detail) Vec2Array CLD_Menkowski(Arena *arena, CLD_Shape *shape0, CLD_Shape *shape1, Xform xf0, Xform xf1, u32 detail)
{ {
Vec2Array result = { .points = PushDry(arena, Vec2) }; Vec2Array result = { .points = ArenaNext(arena, Vec2) };
for (u64 i = 0; i < detail; ++i) for (u64 i = 0; i < detail; ++i)
{ {
f32 angle = ((f32)i / detail) * (2 * Pi); f32 angle = ((f32)i / detail) * (2 * Pi);
@ -1009,7 +1009,7 @@ Vec2Array CLD_Menkowski(Arena *arena, CLD_Shape *shape0, CLD_Shape *shape1, Xfor
Vec2Array CLD_PointCloud(Arena *arena, CLD_Shape *shape0, CLD_Shape *shape1, Xform xf0, Xform xf1) Vec2Array CLD_PointCloud(Arena *arena, CLD_Shape *shape0, CLD_Shape *shape1, Xform xf0, Xform xf1)
{ {
/* FIXME: Account for radius */ /* FIXME: Account for radius */
Vec2Array result = { .points = PushDry(arena, Vec2) }; Vec2Array result = { .points = ArenaNext(arena, Vec2) };
Vec2 *points0 = shape0->points; Vec2 *points0 = shape0->points;
Vec2 *points1 = shape1->points; Vec2 *points1 = shape1->points;
u32 count0 = shape0->count; u32 count0 = shape0->count;

View File

@ -244,7 +244,7 @@ F_Glyph F_GlyphFromCodepoint(F_Font *font, u32 codepoint)
F_Run F_RunFromString(Arena *arena, F_Font *font, String str) F_Run F_RunFromString(Arena *arena, F_Font *font, String str)
{ {
F_Run result = ZI; F_Run result = ZI;
result.rects = PushDry(arena, F_RunRect); result.rects = ArenaNext(arena, F_RunRect);
f32 baseline_length = 0; f32 baseline_length = 0;
for (CodepointIter it = InitCodepointIter(str); NextCodepoint(&it);) for (CodepointIter it = InitCodepointIter(str); NextCodepoint(&it);)

View File

@ -80,7 +80,7 @@ String OS_ReadEntireFile(Arena *arena, OS_File file)
String result = ZI; String result = ZI;
HANDLE handle = (HANDLE)file.handle; HANDLE handle = (HANDLE)file.handle;
u32 chunk_size = Kibi(64); u32 chunk_size = Kibi(64);
result.text = PushDry(arena, u8); result.text = ArenaNext(arena, u8);
for (;;) for (;;)
{ {
u8 *chunk = PushStructsNoZero(arena, u8, chunk_size); u8 *chunk = PushStructsNoZero(arena, u8, chunk_size);
@ -300,7 +300,7 @@ OS_CommandResult OS_RunCommand(Arena *arena, String cmd)
/* Read process output */ /* Read process output */
if (ok) if (ok)
{ {
result.output.text = PushDry(arena, u8); result.output.text = ArenaNext(arena, u8);
b32 exit_code_valid = 0; b32 exit_code_valid = 0;
i32 exit_code = 0; i32 exit_code = 0;
b32 stdout_finished = 0; b32 stdout_finished = 0;

View File

@ -64,7 +64,7 @@ MP3_Result MP3_Decode(Arena *arena, String encoded, u32 sample_rate, MP3_DecodeF
//- Read //- Read
result.samples = PushDry(arena, i16); result.samples = ArenaNext(arena, i16);
u64 sample_bytes_read = 0; u64 sample_bytes_read = 0;
for (;;) for (;;)
{ {

View File

@ -29,7 +29,7 @@ N_Host *N_AcquireHost(u16 listen_port)
host->rcv_buffer_write->arena = AcquireArena(Gibi(64)); host->rcv_buffer_write->arena = AcquireArena(Gibi(64));
host->buddy = AcquireBuddyCtx(Gibi(64)); host->buddy = AcquireBuddyCtx(Gibi(64));
host->channels = PushDry(host->channel_arena, N_Channel); host->channels = ArenaNext(host->channel_arena, N_Channel);
host->num_channel_lookup_bins = N_NumChannelLookupBins; host->num_channel_lookup_bins = N_NumChannelLookupBins;
host->channel_lookup_bins = PushStructs(host->arena, N_ChannelLookupBin, host->num_channel_lookup_bins); host->channel_lookup_bins = PushStructs(host->arena, N_ChannelLookupBin, host->num_channel_lookup_bins);

View File

@ -44,7 +44,7 @@ String P_W32_StringFromWin32Path(Arena *arena, wchar_t *src)
{ {
String result = { String result = {
.len = 0, .len = 0,
.text = PushDry(arena, u8) .text = ArenaNext(arena, u8)
}; };
while (*src) while (*src)