From 5b53617d42b277a87467a0e2721413073fae8641 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 27 Apr 2006 11:31:21 +0000 Subject: [PATCH] correction to exception handling in threads: call wxThread::OnExit() always git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38936 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/msw/thread.cpp | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/msw/thread.cpp b/src/msw/thread.cpp index 9a0bdbb46c..6053694909 100644 --- a/src/msw/thread.cpp +++ b/src/msw/thread.cpp @@ -436,6 +436,10 @@ public: // really start the thread (if it's not already dead) static THREAD_RETVAL DoThreadStart(wxThread *thread); + // call OnExit() on the thread + static void DoThreadOnExit(wxThread *thread); + + void KeepAlive() { if ( m_thread->IsDetached() ) @@ -477,14 +481,25 @@ private: wxThreadInternal& m_thrImpl; }; +/* static */ +void wxThreadInternal::DoThreadOnExit(wxThread *thread) +{ + wxTRY + { + thread->OnExit(); + } + wxCATCH_ALL( wxTheApp->OnUnhandledException(); ) +} + +/* static */ THREAD_RETVAL wxThreadInternal::DoThreadStart(wxThread *thread) { + wxON_BLOCK_EXIT1(DoThreadOnExit, thread); + THREAD_RETVAL rc = (THREAD_RETVAL)-1; wxTRY { - wxON_BLOCK_EXIT_OBJ0(*thread, wxThread::OnExit); - // store the thread object in the TLS if ( !::TlsSetValue(gs_tlsThisThread, thread) ) { @@ -500,6 +515,7 @@ THREAD_RETVAL wxThreadInternal::DoThreadStart(wxThread *thread) return rc; } +/* static */ THREAD_RETVAL THREAD_CALLCONV wxThreadInternal::WinThreadStart(void *param) { THREAD_RETVAL rc = (THREAD_RETVAL)-1; @@ -513,14 +529,16 @@ THREAD_RETVAL THREAD_CALLCONV wxThreadInternal::WinThreadStart(void *param) // start the user code at all then const bool hasExited = thread->m_internal->GetState() == STATE_EXITED; - if ( !hasExited ) + // run the thread function itself inside a SEH try/except block + wxSEH_TRY { - wxSEH_TRY - { + if ( hasExited ) + DoThreadOnExit(thread); + else rc = DoThreadStart(thread); - } - wxSEH_HANDLE((THREAD_RETVAL)-1) } + wxSEH_HANDLE((THREAD_RETVAL)-1) + // save IsDetached because thread object can be deleted by joinable // threads after state is changed to STATE_EXITED. -- 2.47.2