From: Dimitri Schoolwerth Date: Thu, 15 Jan 2004 01:20:42 +0000 (+0000) Subject: Applied patch #877159: Joinable threads might crash app if deleted right after Wait. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/5eba4394790ca9b4da50d7a9ea369d3f623f0af1 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 --- diff --git a/src/msw/thread.cpp b/src/msw/thread.cpp index cc035de03d..f949283aad 100644 --- a/src/msw/thread.cpp +++ b/src/msw/thread.cpp @@ -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 // 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; } @@ -499,17 +501,23 @@ THREAD_RETVAL THREAD_CALLCONV wxThreadInternal::WinThreadStart(void *param) } rc = (THREAD_RETVAL)thread->Entry(); + } + + 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); } - thread->OnExit(); - // 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; }