libstdc++: Throw instead of segfaulting in std::thread constructor [PR 67791]
authorJonathan Wakely <jwakely@redhat.com>
Tue, 24 Nov 2020 12:48:31 +0000 (12:48 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Tue, 24 Nov 2020 14:59:40 +0000 (14:59 +0000)
This turns a mysterious segfault into an exception with a more useful
message. If the exception isn't caught, the user sees this instead of
just a segfault:

terminate called after throwing an instance of 'std::system_error'
  what():  Enable multithreading to use std::thread: Operation not permitted
Aborted (core dumped)

libstdc++-v3/ChangeLog:

PR libstdc++/67791
* src/c++11/thread.cc (thread::_M_start_thread(_State_ptr, void (*)())):
Check that gthreads is available before calling __gthread_create.

libstdc++-v3/src/c++11/thread.cc

index e4dd1687a4b25f3106f1233d5af697b90461bf1d..a9c928049599cd141a04768bebf59caae06fe24c 100644 (file)
@@ -133,6 +133,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   void
   thread::_M_start_thread(_State_ptr state, void (*)())
   {
+    if (!__gthread_active_p())
+      {
+#if __cpp_exceptions
+       throw system_error(make_error_code(errc::operation_not_permitted),
+                          "Enable multithreading to use std::thread");
+#else
+       __builtin_abort();
+#endif
+      }
+
     const int err = __gthread_create(&_M_id._M_thread,
                                     &execute_native_thread_routine,
                                     state.get());