Musa-Cpp-Lib-V2/lib/Base/Base_Thread_Context.cpp

90 lines
2.1 KiB
C++

// See Context_Base in jai, and TCTX in raddebugger:
Thread_Context* get_thread_context();
struct Push_Arena {
Thread_Context* context;
Allocator original_allocator;
Push_Arena(ExpandableArena* arena_ex) {
Assert(is_valid(arena_ex));
context = get_thread_context();
Assert(context != nullptr);
original_allocator = context->allocator;
context->allocator = get_allocator(arena_ex);
}
Push_Arena(Arena* arena) {
Assert(is_valid(arena));
context = get_thread_context();
Assert(context != nullptr);
original_allocator = context->allocator;
context->allocator = get_allocator(arena);
}
~Push_Arena() {
context->allocator = original_allocator;
}
};
struct Push_Allocator {
Thread_Context* context;
Allocator old_allocator;
Push_Allocator (Allocator new_allocator) {
context = get_thread_context();
old_allocator = context->allocator;
context->allocator = new_allocator;
}
~Push_Allocator () {
context->allocator = old_allocator;
}
};
// Thread-local allocators:
PROTOTYPING_API Allocator get_temp_allocator();
PROTOTYPING_API Allocator get_context_allocator();
// C_LINKAGE thread_static TCTX* tctx_thread_local;
thread_static Thread_Context* thread_local_context;
// Start from w32_entry_point_caller ->
// see main_thread_base_entry_point
// //- rjf: set up thread context
// TCTX *tctx = tctx_alloc();
// tctx_select(tctx);
// See: tctx_alloc(void)
// Let's do arenas first.
force_inline void set_thread_context (Thread_Context* new_context) {
thread_local_context = new_context;
}
Thread_Context* get_thread_context () {
return (Thread_Context*)thread_local_context;
}
force_inline Allocator get_temp_allocator() {
return get_allocator(get_thread_context()->temp);
}
force_inline Allocator get_context_allocator() {
Thread_Context* context = get_thread_context();
return context->allocator;
}
void temp_reset_keeping_memory() {
Thread_Context* context = get_thread_context();
arena_reset(context->temp, false);
}
void temp_reset() {
Thread_Context* context = get_thread_context();
arena_reset(context->temp, true);
}