git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25179
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
// first of all, check whether we hadn't been cancelled already and don't
// start the user code at all then
// 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;
}
{
rc = (THREAD_RETVAL)-1;
}
}
rc = (THREAD_RETVAL)thread->Entry();
}
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();
// enter m_critsect before changing the thread state
wxCriticalSectionLocker lock(thread->m_critsect);
// enter m_critsect before changing the thread state
wxCriticalSectionLocker lock(thread->m_critsect);
thread->m_internal->SetState(STATE_EXITED);
}
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();