118 lines
3.3 KiB
Diff
118 lines
3.3 KiB
Diff
|
From 754d67d5ba4a1f9994210d402893a4cf49ce6a71 Mon Sep 17 00:00:00 2001
|
||
|
From: Jonathan Wakely <jwakely@redhat.com>
|
||
|
Date: Mon, 12 Jun 2017 17:37:28 +0100
|
||
|
Subject: [PATCH] PR libstdc++/55917 do not handle exceptions in std::thread
|
||
|
|
||
|
PR libstdc++/55917
|
||
|
* src/c++11/thread.cc (execute_native_thread_routine): Remove
|
||
|
try-block so that exceptions propagate out of the thread and terminate
|
||
|
is called by the exception-handling runtime.
|
||
|
(execute_native_thread_routine_compat): Likewise.
|
||
|
* testsuite/30_threads/thread/cons/terminate.cc: New.
|
||
|
|
||
|
diff --git a/libstdc++-v3/src/c++11/thread.cc b/libstdc++-v3/src/c++11/thread.cc
|
||
|
index 44a230a708e..4a94bdd2f8c 100644
|
||
|
--- a/libstdc++-v3/src/c++11/thread.cc
|
||
|
+++ b/libstdc++-v3/src/c++11/thread.cc
|
||
|
@@ -77,20 +77,7 @@ namespace std _GLIBCXX_VISIBILITY(default)
|
||
|
execute_native_thread_routine(void* __p)
|
||
|
{
|
||
|
thread::_State_ptr __t{ static_cast<thread::_State*>(__p) };
|
||
|
-
|
||
|
- __try
|
||
|
- {
|
||
|
- __t->_M_run();
|
||
|
- }
|
||
|
- __catch(const __cxxabiv1::__forced_unwind&)
|
||
|
- {
|
||
|
- __throw_exception_again;
|
||
|
- }
|
||
|
- __catch(...)
|
||
|
- {
|
||
|
- std::terminate();
|
||
|
- }
|
||
|
-
|
||
|
+ __t->_M_run();
|
||
|
return nullptr;
|
||
|
}
|
||
|
|
||
|
@@ -104,20 +91,7 @@ namespace std _GLIBCXX_VISIBILITY(default)
|
||
|
// the thread state to a local object, breaking the reference cycle
|
||
|
// created in thread::_M_start_thread.
|
||
|
__local.swap(__t->_M_this_ptr);
|
||
|
-
|
||
|
- __try
|
||
|
- {
|
||
|
- __t->_M_run();
|
||
|
- }
|
||
|
- __catch(const __cxxabiv1::__forced_unwind&)
|
||
|
- {
|
||
|
- __throw_exception_again;
|
||
|
- }
|
||
|
- __catch(...)
|
||
|
- {
|
||
|
- std::terminate();
|
||
|
- }
|
||
|
-
|
||
|
+ __t->_M_run();
|
||
|
return nullptr;
|
||
|
}
|
||
|
#endif
|
||
|
diff --git a/libstdc++-v3/testsuite/30_threads/thread/cons/terminate.cc b/libstdc++-v3/testsuite/30_threads/thread/cons/terminate.cc
|
||
|
new file mode 100644
|
||
|
index 00000000000..4b35b6c6024
|
||
|
--- /dev/null
|
||
|
+++ b/libstdc++-v3/testsuite/30_threads/thread/cons/terminate.cc
|
||
|
@@ -0,0 +1,48 @@
|
||
|
+// Copyright (C) 2017 Free Software Foundation, Inc.
|
||
|
+//
|
||
|
+// This file is part of the GNU ISO C++ Library. This library is free
|
||
|
+// software; you can redistribute it and/or modify it under the
|
||
|
+// terms of the GNU General Public License as published by the
|
||
|
+// Free Software Foundation; either version 3, or (at your option)
|
||
|
+// any later version.
|
||
|
+
|
||
|
+// This library is distributed in the hope that it will be useful,
|
||
|
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
+// GNU General Public License for more details.
|
||
|
+
|
||
|
+// You should have received a copy of the GNU General Public License along
|
||
|
+// with this library; see the file COPYING3. If not see
|
||
|
+// <http://www.gnu.org/licenses/>.
|
||
|
+
|
||
|
+// { dg-do run { target *-*-freebsd* *-*-dragonfly* *-*-netbsd* *-*-linux* *-*-gnu* *-*-solaris* *-*-cygwin *-*-rtems* *-*-darwin* powerpc-ibm-aix* } }
|
||
|
+// { dg-options "-pthread" { target *-*-freebsd* *-*-dragonfly* *-*-netbsd* *-*-linux* *-*-gnu* *-*-solaris* powerpc-ibm-aix* } }
|
||
|
+// { dg-require-effective-target c++11 }
|
||
|
+// { dg-require-cstdint "" }
|
||
|
+// { dg-require-gthreads "" }
|
||
|
+
|
||
|
+#include <thread>
|
||
|
+#include <exception>
|
||
|
+#include <cstdlib>
|
||
|
+
|
||
|
+void handle_terminate()
|
||
|
+{
|
||
|
+ std::_Exit(0);
|
||
|
+}
|
||
|
+
|
||
|
+void f() { throw 1; }
|
||
|
+
|
||
|
+void
|
||
|
+test01()
|
||
|
+{
|
||
|
+ std::set_terminate(handle_terminate);
|
||
|
+ std::thread t(f);
|
||
|
+ t.join();
|
||
|
+ std::abort();
|
||
|
+}
|
||
|
+
|
||
|
+int
|
||
|
+main()
|
||
|
+{
|
||
|
+ test01();
|
||
|
+}
|
||
|
--
|
||
|
2.27.0
|
||
|
|