]> git.saurik.com Git - wxWidgets.git/commitdiff
Applied patch #877159: Joinable threads might crash app if deleted right after Wait.
authorDimitri Schoolwerth <dimitri.schoolwerth@gmail.com>
Thu, 15 Jan 2004 01:20:42 +0000 (01:20 +0000)
committerDimitri Schoolwerth <dimitri.schoolwerth@gmail.com>
Thu, 15 Jan 2004 01:20:42 +0000 (01:20 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25179 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/msw/thread.cpp

index cc035de03d4cf82d9923cad7fb69d0b0cfd74410..f949283aad90cc5e32f61788fe447cbe556d9680 100644 (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
     // 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;
 }