]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/thread.cpp
added debug/release DLL configurations so that VC++ chooses the right one when buildi...
[wxWidgets.git] / src / msw / thread.cpp
index f949283aad90cc5e32f61788fe447cbe556d9680..0a1d611ca4c8ecc48d0ba8e3b17afc0888fa180f 100644 (file)
@@ -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()
@@ -884,7 +893,10 @@ unsigned long wxThread::GetCurrentId()
 
 bool wxThread::SetConcurrency(size_t level)
 {
-#ifndef __WXWINCE__
+#ifdef __WXWINCE__
+    wxUnusedVar(level);
+    return false;
+#else
     wxASSERT_MSG( IsMain(), _T("should only be called from the main thread") );
 
     // ok only for the default one
@@ -893,7 +905,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,8 +986,9 @@ bool wxThread::SetConcurrency(size_t level)
 
         return false;
     }
-#endif
+
     return true;
+#endif // __WXWINCE__/!__WXWINCE__
 }
 
 // ctor and dtor