[2/7] gdb: ensure SIGINT is set to SIG_DFL during initialisation

Message ID 69ae1b5d2b57199315d6ce66bedf07b1ae095757.1619125261.git.andrew.burgess@embecosm.com
State New
Headers show
Series
  • New options to control how Python is initialized
Related show

Commit Message

Andrew Burgess April 22, 2021, 9:02 p.m.
In order for our SIGINT handling to work correctly with Python we
require that SIGINT be set to SIG_DFL during Python's initialisation.

Currently this is the case, but, in a later commit I plan to delay the
initialisation of Python until after the point where GDB's own SIGINT
handler has been installed.

The consequence of this is that our SIGINT handling would become
broken.

In this commit I propose adding an RAII class that will ensure SIGINT
is set to SIG_DFL during the call to each extension languages
finish_initialization method.

At this point this change should have not effect.

gdb/ChangeLog:

	* extension.c (struct scoped_default_signal): New struct.
	(scoped_default_sigint): New typedef.
	(finish_ext_lang_initialization): Make use of
	scoped_default_sigint.
---
 gdb/ChangeLog   |  7 +++++++
 gdb/extension.c | 28 +++++++++++++++++++++++++++-
 2 files changed, 34 insertions(+), 1 deletion(-)

-- 
2.25.4

Comments

Tom Tromey April 23, 2021, 2:16 p.m. | #1
>>>>> "Andrew" == Andrew Burgess <andrew.burgess@embecosm.com> writes:


Andrew> gdb/ChangeLog:

Andrew> 	* extension.c (struct scoped_default_signal): New struct.
Andrew> 	(scoped_default_sigint): New typedef.
Andrew> 	(finish_ext_lang_initialization): Make use of
Andrew> 	scoped_default_sigint.

Looks good to me.

Tom

Patch

diff --git a/gdb/extension.c b/gdb/extension.c
index 0e0d42685fc..8f3722d3049 100644
--- a/gdb/extension.c
+++ b/gdb/extension.c
@@ -296,6 +296,29 @@  ext_lang_auto_load_enabled (const struct extension_language_defn *extlang)
   return extlang->script_ops->auto_load_enabled (extlang);
 }
 
+
+/* RAII class used to temporarily return SIG to its default handler.  */
+
+template<int SIG>
+struct scoped_default_signal
+{
+  scoped_default_signal ()
+  { m_old_sig_handler = signal (SIG, SIG_DFL); }
+
+  ~scoped_default_signal ()
+  { signal (SIG, m_old_sig_handler); }
+
+  DISABLE_COPY_AND_ASSIGN (scoped_default_signal);
+
+private:
+  /* The previous signal handler that needs to be restored.  */
+  sighandler_t m_old_sig_handler;
+};
+
+/* Class to temporarily return SIGINT to its default handler.  */
+
+using scoped_default_sigint = scoped_default_signal<SIGINT>;
+
 /* Functions that iterate over all extension languages.
    These only iterate over external extension languages, not including
    GDB's own extension/scripting language, unless otherwise indicated.  */
@@ -310,7 +333,10 @@  finish_ext_lang_initialization (void)
     {
       if (extlang->ops != nullptr
 	  && extlang->ops->finish_initialization != NULL)
-	extlang->ops->finish_initialization (extlang);
+	{
+	  scoped_default_sigint set_sigint_to_default_handler;
+	  extlang->ops->finish_initialization (extlang);
+	}
     }
 }