an alternative fix which should replace patch 781918

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22900 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2003-08-14 22:57:25 +00:00
parent d566b182a5
commit 4f45ba63f4

View File

@@ -760,7 +760,7 @@ wxThreadInternal::WaitForTerminate(bool shouldCancel,
if ( shouldResume ) if ( shouldResume )
Resume(); Resume();
// does is still run? // is it still running?
if ( isRunning || m_state == STATE_RUNNING ) if ( isRunning || m_state == STATE_RUNNING )
{ {
if ( wxThread::IsMain() ) if ( wxThread::IsMain() )
@@ -874,6 +874,12 @@ wxThreadInternal::WaitForTerminate(bool shouldCancel,
if ( pRc ) if ( pRc )
*pRc = rc; *pRc = rc;
// we don't need the thread handle any more
Free();
wxCriticalSectionLocker lock(critsect);
SetState(STATE_EXITED);
return rc == (wxThread::ExitCode)-1 ? wxTHREAD_MISC_ERROR return rc == (wxThread::ExitCode)-1 ? wxTHREAD_MISC_ERROR
: wxTHREAD_NO_ERROR; : wxTHREAD_NO_ERROR;
} }
@@ -937,10 +943,6 @@ bool wxThread::IsMain()
return ::GetCurrentThreadId() == gs_idMainThread; return ::GetCurrentThreadId() == gs_idMainThread;
} }
#ifdef Yield
#undef Yield
#endif
void wxThread::Yield() void wxThread::Yield()
{ {
// 0 argument to Sleep() is special and means to just give away the rest of // 0 argument to Sleep() is special and means to just give away the rest of
@@ -1135,30 +1137,12 @@ wxThread::ExitCode wxThread::Wait()
(void)m_internal->WaitForTerminate(false, m_critsect, &rc); (void)m_internal->WaitForTerminate(false, m_critsect, &rc);
m_internal->Free();
wxCriticalSectionLocker lock(m_critsect);
m_internal->SetState(STATE_EXITED);
return rc; return rc;
} }
wxThreadError wxThread::Delete(ExitCode *pRc) wxThreadError wxThread::Delete(ExitCode *pRc)
{ {
wxThreadError rc = m_internal->WaitForTerminate(true, m_critsect, pRc); return 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;
} }
wxThreadError wxThread::Kill() wxThreadError wxThread::Kill()