per_thread thread_context *ThreadLocal_ThreadContext = 0;

static thread_context AllocateThreadContext(void)
{
	thread_context Context = {};
	for(s64 ArenaIndex = 0; ArenaIndex < ArrayCount(Context.Arenas); ArenaIndex += 1)
	{
		Context.Arenas[ArenaIndex] = ArenaAlloc(Megabytes(2), true, "Scratch Arena %i", ArenaIndex);
	}
	return(Context);
}

static void SetThreadContext(thread_context *Context)
{
	ThreadLocal_ThreadContext = Context;
}

static thread_context *GetThreadContext(void)
{
	return(ThreadLocal_ThreadContext);
}

static temp GetScratch(arena **Conflicts, u64 ConflictCount)
{
	temp Scratch = {};
	thread_context *Context = GetThreadContext();
	
	for(u64 ArenaIndex = 0;
        ArenaIndex < ArrayCount(Context->Arenas);
        ++ArenaIndex)
	{
		b32 FoundConflict = false;
		for(u64 ConflictIndex = 0;
            ConflictIndex < ConflictCount;
            ++ConflictIndex)
		{
			arena *Conflict = Conflicts[ConflictIndex];
			if(Conflict == Context->Arenas[ArenaIndex])
			{
				FoundConflict = true;
				break;
			}
		}
		
		if(!FoundConflict)
		{
			Scratch = BeginTemp(Context->Arenas[ArenaIndex]);
			break;
		}
	}
	
	Assert(Scratch.Arena);
	
	return(Scratch);
}
