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.
This commit is contained in:
Tom Tromey 2020-11-20 08:22:46 -07:00
parent 9d37f01307
commit 14f62a099a
2 changed files with 19 additions and 2 deletions

View File

@ -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:

View File

@ -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. */