void ArchMultithreadPosix::testCancelThreadImpl(ArchThreadImpl* thread) { assert(thread != NULL); // update cancel state lockMutex(m_threadMutex); bool cancel = false; if (thread->m_cancel && !thread->m_cancelling) { thread->m_cancelling = true; thread->m_cancel = false; cancel = true; } unlockMutex(m_threadMutex); // unwind thread's stack if cancelling if (cancel) { throw XThreadCancel(); } }
void ArchMultithreadWindows::testCancelThreadImpl(ArchThreadImpl* thread) { assert(thread != NULL); // poll cancel event. return if not set. const DWORD result = WaitForSingleObject(thread->m_cancel, 0); if (result != WAIT_OBJECT_0) { return; } // update cancel state lockMutex(m_threadMutex); bool cancel = !thread->m_cancelling; thread->m_cancelling = true; ResetEvent(thread->m_cancel); unlockMutex(m_threadMutex); // unwind thread's stack if cancelling if (cancel) { throw XThreadCancel(); } }