#pragma hdrstop
#endif
+#if wxUSE_THREADS
+
+#include "wx/thread.h"
+
#ifndef WX_PRECOMP
#include "wx/intl.h"
#include "wx/app.h"
#endif
-#if wxUSE_THREADS
-
#include "wx/apptrait.h"
#include "wx/scopeguard.h"
#include "wx/except.h"
#include "wx/module.h"
-#include "wx/thread.h"
// must have this symbol defined to get _beginthread/_endthread declarations
#ifndef _MT
// 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() )
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) )
{
return rc;
}
+/* static */
THREAD_RETVAL THREAD_CALLCONV wxThreadInternal::WinThreadStart(void *param)
{
THREAD_RETVAL rc = (THREAD_RETVAL)-1;
// 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.
#include "wx/thrimpl.cpp"
#endif // wxUSE_THREADS
-