X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5eba4394790ca9b4da50d7a9ea369d3f623f0af1..654c02dc23c6eae6a2732209f9a3a4ae6f084bd3:/src/msw/thread.cpp diff --git a/src/msw/thread.cpp b/src/msw/thread.cpp index f949283aad..6a8e87350c 100644 --- a/src/msw/thread.cpp +++ b/src/msw/thread.cpp @@ -526,7 +526,7 @@ void wxThreadInternal::SetPriority(unsigned int priority) { m_priority = priority; - // translate wxWindows priority to the Windows one + // translate wxWidgets priority to the Windows one int win_priority; if (m_priority <= 20) win_priority = THREAD_PRIORITY_LOWEST; @@ -740,7 +740,7 @@ wxThreadInternal::WaitForTerminate(wxCriticalSection& cs, // // NB: we still must include QS_ALLINPUT even when waiting // in a secondary thread because if it had created some - // window somehow (possible not even using wxWindows) + // window somehow (possible not even using wxWidgets) // the system might dead lock then if ( wxThread::IsMain() ) { @@ -777,15 +777,24 @@ wxThreadInternal::WaitForTerminate(wxCriticalSection& cs, // although the thread might be already in the EXITED state it might not // have terminated yet and so we are not sure that it has actually // terminated if the "if" above hadn't been taken - do + for ( ;; ) { if ( !::GetExitCodeThread(m_hThread, (LPDWORD)&rc) ) { wxLogLastError(wxT("GetExitCodeThread")); rc = (wxThread::ExitCode)-1; + + break; } - } while ( (DWORD)rc == STILL_ACTIVE ); + + if ( (DWORD)rc != STILL_ACTIVE ) + break; + + // give the other thread some time to terminate, otherwise we may be + // starving it + ::Sleep(1); + } if ( pRc ) *pRc = rc; @@ -854,7 +863,7 @@ wxThread *wxThread::This() bool wxThread::IsMain() { - return ::GetCurrentThreadId() == gs_idMainThread; + return ::GetCurrentThreadId() == gs_idMainThread || gs_idMainThread == 0; } void wxThread::Yield() @@ -893,7 +902,7 @@ bool wxThread::SetConcurrency(size_t level) // get system affinity mask first HANDLE hProcess = ::GetCurrentProcess(); - DWORD dwProcMask, dwSysMask; + DWORD_PTR dwProcMask, dwSysMask; if ( ::GetProcessAffinityMask(hProcess, &dwProcMask, &dwSysMask) == 0 ) { wxLogLastError(_T("GetProcessAffinityMask")); @@ -974,7 +983,8 @@ bool wxThread::SetConcurrency(size_t level) return false; } -#endif +#endif // !__WXWINCE__ + return true; }