[PATCH] Ignore system_error in thread startup

Tom Tromey tromey@adacore.com
Wed Nov 11 20:19:52 GMT 2020


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-11  Tom Tromey  <tromey@adacore.com>

	* thread-pool.cc (thread_pool::set_thread_count): Ignore system
	errors.
---
 gdbsupport/ChangeLog      |  5 +++++
 gdbsupport/thread-pool.cc | 16 ++++++++++++++--
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/gdbsupport/thread-pool.cc b/gdbsupport/thread-pool.cc
index be9ca22682a..06586f7da03 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.  */
-- 
2.26.2



More information about the Gdb-patches mailing list