X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/32632baf6d4a9c9d03fb8b17a7a9a4a2aa339999..cb9811beb86d1925cfe04f041bde3df8678e6240:/src/unix/threadpsx.cpp?ds=sidebyside

diff --git a/src/unix/threadpsx.cpp b/src/unix/threadpsx.cpp
index 1d77856e80..de36955cda 100644
--- a/src/unix/threadpsx.cpp
+++ b/src/unix/threadpsx.cpp
@@ -54,6 +54,10 @@
     #include <thread.h>
 #endif
 
+#ifdef HAVE_ABI_FORCEDUNWIND
+    #include <cxxabi.h>
+#endif
+
 // we use wxFFile under Linux in GetCPUCount()
 #ifdef __LINUX__
     #include "wx/ffile.h"
@@ -857,6 +861,18 @@ void *wxThreadInternal::PthreadStart(wxThread *thread)
                        wxT("Thread %p Entry() returned %lu."),
                        THR_ID(pthread), wxPtrToUInt(pthread->m_exitcode));
         }
+#ifdef HAVE_ABI_FORCEDUNWIND
+        // When using common C++ ABI under Linux we must always rethrow this
+        // special exception used to unwind the stack when the thread was
+        // cancelled, otherwise the thread library would simply terminate the
+        // program, see http://udrepper.livejournal.com/21541.html
+        catch ( abi::__forced_unwind& )
+        {
+            wxCriticalSectionLocker lock(thread->m_critsect);
+            pthread->SetState(STATE_EXITED);
+            throw;
+        }
+#endif // HAVE_ABI_FORCEDUNWIND
         wxCATCH_ALL( wxTheApp->OnUnhandledException(); )
 
         {
@@ -1837,7 +1853,7 @@ static void DeleteThread(wxThread *This)
     }
 }
 
-#ifndef __WXOSX__
+#ifndef __DARWIN__
 
 void wxMutexGuiEnterImpl()
 {