From: Jonathan Wakely Date: Tue, 24 Nov 2020 12:48:31 +0000 (+0000) Subject: libstdc++: Throw instead of segfaulting in std::thread constructor [PR 67791] X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4bbd5d0c5fb2b7527938ad44a6d8a2f2ef8bbe12;p=gcc.git libstdc++: Throw instead of segfaulting in std::thread constructor [PR 67791] 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. --- diff --git a/libstdc++-v3/src/c++11/thread.cc b/libstdc++-v3/src/c++11/thread.cc index e4dd1687a4b..a9c92804959 100644 --- a/libstdc++-v3/src/c++11/thread.cc +++ b/libstdc++-v3/src/c++11/thread.cc @@ -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());