diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2020-11-24 12:48:31 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2020-11-24 14:59:40 +0000 |
commit | 4bbd5d0c5fb2b7527938ad44a6d8a2f2ef8bbe12 (patch) | |
tree | 8de133e5cef6277ac4f0eb72fa18c24867b07d09 /libstdc++-v3 | |
parent | e253d36214015ed10ffd335e3628ccaac22dd5c7 (diff) | |
download | gcc-4bbd5d0c5fb2b7527938ad44a6d8a2f2ef8bbe12.zip gcc-4bbd5d0c5fb2b7527938ad44a6d8a2f2ef8bbe12.tar.gz gcc-4bbd5d0c5fb2b7527938ad44a6d8a2f2ef8bbe12.tar.bz2 |
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.
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/src/c++11/thread.cc | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/libstdc++-v3/src/c++11/thread.cc b/libstdc++-v3/src/c++11/thread.cc index e4dd168..a9c9280 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()); |