]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/thread.cpp
Moved wxToolBarSimple to deprecated library
[wxWidgets.git] / src / msw / thread.cpp
index 976c7412d683b887b2f9c33adde2282502275ad5..7cfa033a6466112b47c767c3b6feffd85a96cd06 100644 (file)
@@ -10,7 +10,7 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "thread.h"
 #endif
 
@@ -389,6 +389,8 @@ private:
 
     wxMutex& m_mutex;
     wxSemaphore m_semaphore;
+
+    DECLARE_NO_COPY_CLASS(wxConditionInternal)
 };
 
 wxConditionInternal::wxConditionInternal(wxMutex& mutex)
@@ -758,7 +760,7 @@ wxThreadInternal::WaitForTerminate(bool shouldCancel,
     if ( shouldResume )
         Resume();
 
-    // does is still run?
+    // is it still running?
     if ( isRunning || m_state == STATE_RUNNING )
     {
         if ( wxThread::IsMain() )
@@ -816,7 +818,15 @@ wxThreadInternal::WaitForTerminate(bool shouldCancel,
                     break;
 
                 case WAIT_OBJECT_0 + 1:
-                    // new message arrived, process it
+                    // new message arrived, process it -- but only if we're the
+                    // main thread as we don't support processing messages in
+                    // the other ones
+                    //
+                    // 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)
+                    //     the system might dead lock then
+                    if ( wxThread::IsMain() )
                     {
                         // it looks that sometimes WAIT_OBJECT_0 + 1 is
                         // returned but there are no messages in the thread
@@ -864,6 +874,12 @@ wxThreadInternal::WaitForTerminate(bool shouldCancel,
     if ( pRc )
         *pRc = rc;
 
+    // we don't need the thread handle any more
+    Free();
+
+    wxCriticalSectionLocker lock(cs);
+    SetState(STATE_EXITED);
+
     return rc == (wxThread::ExitCode)-1 ? wxTHREAD_MISC_ERROR
                                         : wxTHREAD_NO_ERROR;
 }
@@ -927,10 +943,6 @@ bool wxThread::IsMain()
     return ::GetCurrentThreadId() == gs_idMainThread;
 }
 
-#ifdef Yield
-#undef Yield
-#endif
-
 void wxThread::Yield()
 {
     // 0 argument to Sleep() is special and means to just give away the rest of
@@ -1125,30 +1137,12 @@ wxThread::ExitCode wxThread::Wait()
 
     (void)m_internal->WaitForTerminate(false, m_critsect, &rc);
 
-    m_internal->Free();
-
-    wxCriticalSectionLocker lock(m_critsect);
-    m_internal->SetState(STATE_EXITED);
-
     return rc;
 }
 
 wxThreadError wxThread::Delete(ExitCode *pRc)
 {
-    wxThreadError rc = m_internal->WaitForTerminate(true, m_critsect, pRc);
-
-    if ( IsDetached() )
-    {
-        delete this;
-    }
-    else // joinable
-    {
-        // update the status of the joinable thread
-        wxCriticalSectionLocker lock(m_critsect);
-        m_internal->SetState(STATE_EXITED);
-    }
-
-    return rc;
+    return m_internal->WaitForTerminate(true, m_critsect, pRc);
 }
 
 wxThreadError wxThread::Kill()