public void PushContext() { System.Diagnostics.Debug.Assert(m_Kernel.InKernelMode()); long count = Interlocked.Add(ref m_SuspendFlag, SUSPEND_FLAG_KERNEL_REQUEST) - SUSPEND_FLAG_KERNEL_REQUEST; System.Diagnostics.Debug.Assert((count & SUSPEND_FLAG_KERNEL_REQUEST) == 0); if (count == SUSPEND_FLAG_DELAY_SUSPEND) { for (; ;) { switch (m_SuspendFlag & (SUSPEND_FLAG_DELAY_SUSPEND | SUSPEND_FLAG_END_DELAY | SUSPEND_FLAG_SUSPENDING)) { case 0: m_Thread.Suspend(); break; case SUSPEND_FLAG_END_DELAY: continue; case SUSPEND_FLAG_SUSPENDING: default: break; } break; } } }