This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFC] Block all async signals used by gdb when initializing Guile


Hi.

When Guile initializes it will start several GC threads (libgc).
It's important that these threads block SIGCHLD (PR 17247).

This patch extends this to all async signals used by gdb.

One improvement on this patch would be to have event-top.c (or some
such) provide a routine that calls sigaddset for each appropriate
signal rather than defining the list in guile.c.

2015-08-29  Doug Evans  <xdje42@gmail.com>

	* guile/guile.c (_initialize_guile): Block all asynchronous signals
	used by gdb when initializing Guile.

diff --git a/gdb/guile/guile.c b/gdb/guile/guile.c
index 4abf5c5..e9ef70b 100644
--- a/gdb/guile/guile.c
+++ b/gdb/guile/guile.c
@@ -847,7 +847,7 @@ _initialize_guile (void)
 #if HAVE_GUILE
   {
 #ifdef HAVE_SIGPROCMASK
-    sigset_t sigchld_mask, prev_mask;
+    sigset_t guile_init_mask, prev_mask;
 #endif
 
     /* The Python support puts the C side in module "_gdb", leaving the Python
@@ -867,9 +867,23 @@ _initialize_guile (void)
        have SIGCHLD blocked.  PR 17247.
        Really libgc and Guile should do this, but we need to work with
        libgc 7.4.x.  */
-    sigemptyset (&sigchld_mask);
-    sigaddset (&sigchld_mask, SIGCHLD);
-    sigprocmask (SIG_BLOCK, &sigchld_mask, &prev_mask);
+    sigemptyset (&guile_init_mask);
+    sigaddset (&guile_init_mask, SIGCHLD);
+    /* Also block other asynchronous signals used by GDB.  See event-top.c.
+       Really we want to block every signal here except for those specifically
+       used by Guile (e.g., GC threads), but this is safer for now.  */
+    sigaddset (&guile_init_mask, SIGINT);
+    sigaddset (&guile_init_mask, SIGTERM);
+#ifdef SIGQUIT
+    sigaddset (&guile_init_mask, SIGQUIT);
+#endif
+#ifdef SIGHUP
+    sigaddset (&guile_init_mask, SIGHUP);
+#endif
+#ifdef SIGWINCH
+    sigaddset (&guile_init_mask, SIGWINCH);
+#endif
+    sigprocmask (SIG_BLOCK, &guile_init_mask, &prev_mask);
 #endif
 
     /* scm_with_guile is the most portable way to initialize Guile.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]