private static Thread InitializeCurrentThread() { Debug.Assert(t_currentThread == null); var currentThread = new Thread(); Debug.Assert(currentThread._threadState == (int)ThreadState.Unstarted); ThreadState state = 0; // The main thread is foreground, other ones are background if (currentThread._managedThreadId.Id != System.Threading.ManagedThreadId.IdMainThread) { state |= ThreadState.Background; } else { Interlocked.Increment(ref s_foregroundRunningCount); } currentThread._threadState = (int)(state | ThreadState.Running); currentThread.PlatformSpecificInitializeExistingThread(); currentThread._priority = currentThread.GetPriorityLive(); t_currentThread = currentThread; return(currentThread); }
// Slow path executed once per thread private static Thread InitializeExistingThread(bool threadPoolThread) { Debug.Assert(t_currentThread == null); var currentThread = new Thread(); currentThread._managedThreadId = System.Threading.ManagedThreadId.GetCurrentThreadId(); Debug.Assert(currentThread._threadState == (int)ThreadState.Unstarted); ThreadState state = threadPoolThread ? ThreadPoolThread : 0; // The main thread is foreground, other ones are background if (currentThread._managedThreadId.Id != System.Threading.ManagedThreadId.IdMainThread) { state |= ThreadState.Background; } currentThread._threadState = (int)(state | ThreadState.Running); currentThread.PlatformSpecificInitializeExistingThread(); currentThread._priority = currentThread.GetPriorityLive(); t_currentThread = currentThread; if (threadPoolThread) { InitializeExistingThreadPoolThread(); } return(currentThread); }