Applied patch #877159: Joinable threads might crash app if deleted right after Wait.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25179 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Dimitri Schoolwerth
2004-01-15 01:20:42 +00:00
parent eb9b610777
commit 5eba439479

View File

@@ -484,7 +484,9 @@ THREAD_RETVAL THREAD_CALLCONV wxThreadInternal::WinThreadStart(void *param)
// first of all, check whether we hadn't been cancelled already and don't // first of all, check whether we hadn't been cancelled already and don't
// start the user code at all then // start the user code at all then
if ( thread->m_internal->GetState() == STATE_EXITED ) bool isExited = (thread->m_internal->GetState() == STATE_EXITED);
if ( isExited )
{ {
rc = (THREAD_RETVAL)-1; rc = (THREAD_RETVAL)-1;
} }
@@ -499,17 +501,23 @@ THREAD_RETVAL THREAD_CALLCONV wxThreadInternal::WinThreadStart(void *param)
} }
rc = (THREAD_RETVAL)thread->Entry(); rc = (THREAD_RETVAL)thread->Entry();
// enter m_critsect before changing the thread state
wxCriticalSectionLocker lock(thread->m_critsect);
thread->m_internal->SetState(STATE_EXITED);
} }
thread->OnExit(); thread->OnExit();
// save IsDetached because thread object can be deleted by joinable
// threads after state is changed to STATE_EXITED.
bool isDetached = thread->IsDetached();
if (!isExited)
{
// enter m_critsect before changing the thread state
wxCriticalSectionLocker lock(thread->m_critsect);
thread->m_internal->SetState(STATE_EXITED);
}
// the thread may delete itself now if it wants, we don't need it any more // the thread may delete itself now if it wants, we don't need it any more
thread->m_internal->LetDie(); if (isDetached) thread->m_internal->LetDie();
return rc; return rc;
} }