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:
@@ -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()
|
||||||
|
Reference in New Issue
Block a user