#pragma hdrstop
#endif
+#if wxUSE_THREADS
+
+#include "wx/thread.h"
+
#ifndef WX_PRECOMP
+ #include "wx/msw/missing.h"
#include "wx/intl.h"
#include "wx/app.h"
+ #include "wx/module.h"
#endif
-#if wxUSE_THREADS
-
#include "wx/apptrait.h"
#include "wx/scopeguard.h"
#include "wx/msw/private.h"
-#include "wx/msw/missing.h"
#include "wx/msw/seh.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
{
#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 300)
if ( !::ReleaseSemaphore(m_semaphore, 1, NULL /* ptr to previous count */) )
-#endif
{
- wxLogLastError(_T("ReleaseSemaphore"));
-
- return wxSEMA_MISC_ERROR;
+ if ( GetLastError() == ERROR_TOO_MANY_POSTS )
+ {
+ return wxSEMA_OVERFLOW;
+ }
+ else
+ {
+ wxLogLastError(_T("ReleaseSemaphore"));
+ return wxSEMA_MISC_ERROR;
+ }
}
return wxSEMA_NO_ERROR;
+#else
+ return wxSEMA_MISC_ERROR;
+#endif
}
// ----------------------------------------------------------------------------
// 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
-