Files
Juliet/Juliet/core/core_thread_context.c
T
2026-10-18 23:41:43 -04:00

72 lines
1.8 KiB
C

// =============================================================================
// Globals
thread_static TCTX* tctx_thread_local;
// =============================================================================
// Thread Context Functions
// Thread Context allocation
internal TCTX* tctx_alloc()
{
#if BUILD_DEBUG
thread_static static char name[2][1024];
juliet_snprintf(name[0], sizeof(name[0]), "Scratch/0[TID:%u]", tid());
juliet_snprintf(name[1], sizeof(name[1]), "Scratch/1[TID:%u]", tid());
Arena* arena_0 = arena_alloc(.name = name[0]);
Arena* arena_1 = arena_alloc(.name = name[1]);
#else
Arena* arena_0 = arena_alloc();
Arena* arena_1 = arena_alloc();
#endif
TCTX* tctx = push_array(arena_0, TCTX, 1);
tctx->arenas[0] = arena_0;
tctx->arenas[1] = arena_1;
return tctx;
}
internal void tctx_release(TCTX* tctx)
{
arena_release(tctx->arenas[1]);
arena_release(tctx->arenas[0]);
}
internal void tctx_select(TCTX* tctx)
{
tctx_thread_local = tctx;
}
internal TCTX* tctx_selected()
{
return tctx_thread_local;
}
internal Arena* tctx_get_scratch(Arena** conflicts, uint64 count)
{
TCTX* tctx = tctx_selected();
Arena* result = 0;
Arena** arena_ptr = tctx->arenas;
for (uint64 i = 0; i < ArrayCount(tctx->arenas); ++i, ++arena_ptr)
{
Arena** conflict_ptr = conflicts;
bool32 has_conflict = 0;
for (uint64 j = 0; j < count; ++j, ++conflict_ptr)
{
if (*arena_ptr == *conflict_ptr)
{
has_conflict = 1;
break;
}
}
if (!has_conflict)
{
result = *arena_ptr;
break;
}
}
return result;
}
#define scratch_begin(conflicts, count) temp_begin(tctx_get_scratch((conflicts), (count)))
#define scratch_end(scratch) temp_end(scratch)