X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4676948b6814c97b93c431a8cbcd8c0352c87ba9..8a82c9ecc9a2cba9727b538c818ebdba243eacbc:/src/msw/thread.cpp diff --git a/src/msw/thread.cpp b/src/msw/thread.cpp index 976c7412d6..7cfa033a64 100644 --- a/src/msw/thread.cpp +++ b/src/msw/thread.cpp @@ -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()