72 lines
1.8 KiB
C
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)
|