Fix, or at least make less common, deadlock in the thread sample.

Don't always deadlock when "Stop the last spawned thread" menu command is
selected. There is still a problem with a race condition which could result in
a crash when dereferencing an invalid pointer, but at least this doesn't
happen all the time, unlike the current bug.

Of course, the real solution would be to properly rewrite the sample to show
how thread deletion should be handled correctly...

See #14891.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73568 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2013-02-24 13:48:57 +00:00
parent 4f082fb3a0
commit 44f4afd2da

View File

@@ -596,6 +596,8 @@ void MyFrame::OnStartThread(wxCommandEvent& WXUNUSED(event) )
} }
void MyFrame::OnStopThread(wxCommandEvent& WXUNUSED(event) ) void MyFrame::OnStopThread(wxCommandEvent& WXUNUSED(event) )
{
wxThread* toDelete = NULL;
{ {
wxCriticalSectionLocker enter(wxGetApp().m_critsect); wxCriticalSectionLocker enter(wxGetApp().m_critsect);
@@ -606,7 +608,15 @@ void MyFrame::OnStopThread(wxCommandEvent& WXUNUSED(event) )
} }
else else
{ {
wxGetApp().m_threads.Last()->Delete(); toDelete = wxGetApp().m_threads.Last();
}
}
if ( toDelete )
{
// This can still crash if the thread gets to delete itself
// in the mean time.
toDelete->Delete();
#if wxUSE_STATUSBAR #if wxUSE_STATUSBAR
SetStatusText(wxT("Last thread stopped."), 1); SetStatusText(wxT("Last thread stopped."), 1);