62 lines
1.4 KiB
C
62 lines
1.4 KiB
C
/* date = April 30th 2023 11:35 am */
|
|
|
|
#ifndef VN_THREAD_CONTEXT_H
|
|
#define VN_THREAD_CONTEXT_H
|
|
|
|
#define per_thread __declspec(thread)
|
|
|
|
struct thread_context
|
|
{
|
|
memory_arena Arenas[2];
|
|
};
|
|
|
|
per_thread thread_context *ThreadLocal_ThreadContext = 0;
|
|
|
|
inline void SetThreadContext(thread_context *Context)
|
|
{
|
|
ThreadLocal_ThreadContext = Context;
|
|
}
|
|
|
|
inline thread_context *GetThreadContext(void)
|
|
{
|
|
return(ThreadLocal_ThreadContext);
|
|
}
|
|
|
|
static temporary_memory GetScratch(memory_arena **Conflicts, u64 ConflictCount)
|
|
{
|
|
temporary_memory Scratch = {};
|
|
thread_context *Context = GetThreadContext();
|
|
|
|
for(u64 ArenaIndex = 0;
|
|
ArenaIndex < ArrayCount(Context->Arenas);
|
|
++ArenaIndex)
|
|
{
|
|
b32 FoundConflict = false;
|
|
for(u64 ConflictIndex = 0;
|
|
ConflictIndex < ConflictCount;
|
|
++ConflictIndex)
|
|
{
|
|
memory_arena *Conflict = Conflicts[ConflictIndex];
|
|
if(Conflict == Context->Arenas + ArenaIndex)
|
|
{
|
|
FoundConflict = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(!FoundConflict)
|
|
{
|
|
Scratch = BeginTemporaryMemory(Context->Arenas + ArenaIndex);
|
|
break;
|
|
}
|
|
}
|
|
|
|
Assert(Scratch.Arena);
|
|
|
|
return(Scratch);
|
|
}
|
|
|
|
#define ReleaseScratch(Scratch) EndTemporaryMemory(Scratch)
|
|
|
|
#endif //VN_THREAD_CONTEXT_H
|