diff options
author | Tom Tromey <tromey@adacore.com> | 2020-11-20 08:22:46 -0700 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2020-11-20 08:22:46 -0700 |
commit | 14f62a099a0287c858ac7f4882e88736c11ed1cc (patch) | |
tree | 4fd1595ed9c281e91572785ba651dd85430dd0eb | |
parent | 9d37f01307db492370a260e3ef9aee10b363fec2 (diff) | |
download | fsf-binutils-gdb-14f62a099a0287c858ac7f4882e88736c11ed1cc.zip fsf-binutils-gdb-14f62a099a0287c858ac7f4882e88736c11ed1cc.tar.gz fsf-binutils-gdb-14f62a099a0287c858ac7f4882e88736c11ed1cc.tar.bz2 |
Ignore system_error in thread startup
libstdc++ might change so that it always implements std::thread, but
then have thread startup simply fail. This is being discussed here:
https://gcc.gnu.org/pipermail/gcc-patches/2020-November/558736.html
This patch pre-emptively changes gdb to handle this scenario. It
seemed fine to me to ignore all system errors at thread startup, so
that is what this does.
gdbsupport/ChangeLog
2020-11-20 Tom Tromey <tromey@adacore.com>
* thread-pool.cc (thread_pool::set_thread_count): Ignore system
errors.
-rw-r--r-- | gdbsupport/ChangeLog | 5 | ||||
-rw-r--r-- | gdbsupport/thread-pool.cc | 16 |
2 files changed, 19 insertions, 2 deletions
diff --git a/gdbsupport/ChangeLog b/gdbsupport/ChangeLog index 2e5b3fa..d1e46a3 100644 --- a/gdbsupport/ChangeLog +++ b/gdbsupport/ChangeLog @@ -1,3 +1,8 @@ +2020-11-20 Tom Tromey <tromey@adacore.com> + + * thread-pool.cc (thread_pool::set_thread_count): Ignore system + errors. + 2020-11-10 Tom Tromey <tromey@adacore.com> PR build/26848: diff --git a/gdbsupport/thread-pool.cc b/gdbsupport/thread-pool.cc index be9ca22..06586f7 100644 --- a/gdbsupport/thread-pool.cc +++ b/gdbsupport/thread-pool.cc @@ -25,6 +25,7 @@ #include "gdbsupport/alt-stack.h" #include "gdbsupport/block-signals.h" #include <algorithm> +#include <system_error> /* On the off chance that we have the pthread library on a Windows host, but std::thread is not using it, avoid calling @@ -102,8 +103,19 @@ thread_pool::set_thread_count (size_t num_threads) block_signals blocker; for (size_t i = m_thread_count; i < num_threads; ++i) { - std::thread thread (&thread_pool::thread_function, this); - thread.detach (); + try + { + std::thread thread (&thread_pool::thread_function, this); + thread.detach (); + } + catch (const std::system_error &) + { + /* libstdc++ may not implement std::thread, and will + throw an exception on use. It seems fine to ignore + this, and any other sort of startup failure here. */ + num_threads = i; + break; + } } } /* If the new size is smaller, terminate some existing threads. */ |