aboutsummaryrefslogtreecommitdiff
path: root/gdb/guile
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2019-09-29 08:50:15 -0600
committerTom Tromey <tom@tromey.com>2019-11-26 14:02:57 -0700
commit21987b9c060033d367abc50c29f786df4c21b10c (patch)
tree6071a96c314722b150c9a228478d594ed11c68b0 /gdb/guile
parent5e03027845ecc877621ea71bc342a30ecf2999ff (diff)
downloadgdb-21987b9c060033d367abc50c29f786df4c21b10c.zip
gdb-21987b9c060033d367abc50c29f786df4c21b10c.tar.gz
gdb-21987b9c060033d367abc50c29f786df4c21b10c.tar.bz2
Add RAII class for blocking gdb signals
This adds configury support and an RAII class that can be used to temporarily block signals that are used by gdb. (This class is not used in this patch, but it split out for easier review.) The idea of this patch is that these signals should only be delivered to the main thread. So, when creating a background thread, they are temporarily blocked; the blocked state is inherited by the new thread. The sigprocmask man page says: The use of sigprocmask() is unspecified in a multithreaded process; see pthread_sigmask(3). This patch changes gdb to use pthread_sigmask when appropriate, by introducing a convenience define. I've updated gdbserver as well, because I had to touch gdbsupport, and because the threading patches will make it link against the thread library. I chose not to touch the NTO code, because I don't know anything about that platform and because I cannot test it. Finally, this modifies an existing spot in the Guile layer to use the new facility. gdb/ChangeLog 2019-11-26 Tom Tromey <tom@tromey.com> * gdbsupport/signals-state-save-restore.c (original_signal_mask): Remove comment. (save_original_signals_state, restore_original_signals_state): Use gdb_sigmask. * linux-nat.c (block_child_signals, restore_child_signals_mask) (_initialize_linux_nat): Use gdb_sigmask. * guile/guile.c (_initialize_guile): Use block_signals. * Makefile.in (HFILES_NO_SRCDIR): Add gdb-sigmask.h. * gdbsupport/gdb-sigmask.h: New file. * event-top.c (async_sigtstp_handler): Use gdb_sigmask. * cp-support.c (gdb_demangle): Use gdb_sigmask. * gdbsupport/common.m4 (GDB_AC_COMMON): Check for pthread_sigmask. * configure, config.in: Rebuild. * gdbsupport/block-signals.h: New file. gdb/gdbserver/ChangeLog 2019-11-26 Tom Tromey <tom@tromey.com> * remote-utils.c (block_unblock_async_io): Use gdb_sigmask. * linux-low.c (linux_wait_for_event_filtered, linux_async): Use gdb_sigmask. * configure, config.in: Rebuild. Change-Id: If3f37dc57dd859c226e9e4d79458a0514746e8c6
Diffstat (limited to 'gdb/guile')
-rw-r--r--gdb/guile/guile.c28
1 files changed, 10 insertions, 18 deletions
diff --git a/gdb/guile/guile.c b/gdb/guile/guile.c
index 55929f4..d745c56 100644
--- a/gdb/guile/guile.c
+++ b/gdb/guile/guile.c
@@ -36,6 +36,7 @@
#include "guile-internal.h"
#endif
#include <signal.h>
+#include "gdbsupport/block-signals.h"
/* The Guile version we're using.
We *could* use the macros in libguile/version.h but that would preclude
@@ -798,10 +799,6 @@ _initialize_guile (void)
#if HAVE_GUILE
{
-#ifdef HAVE_SIGPROCMASK
- sigset_t sigchld_mask, prev_mask;
-#endif
-
/* The Python support puts the C side in module "_gdb", leaving the Python
side to define module "gdb" which imports "_gdb". There is evidently no
similar convention in Guile so we skip this. */
@@ -813,25 +810,20 @@ _initialize_guile (void)
scm_set_automatic_finalization_enabled (0);
#endif
-#ifdef HAVE_SIGPROCMASK
- /* Before we initialize Guile, block SIGCHLD.
+ /* Before we initialize Guile, block signals needed by gdb
+ (especially SIGCHLD).
This is done so that all threads created during Guile initialization
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);
-#endif
-
- /* scm_with_guile is the most portable way to initialize Guile.
- Plus we need to initialize the Guile support while in Guile mode
- (e.g., called from within a call to scm_with_guile). */
- scm_with_guile (call_initialize_gdb_module, NULL);
+ {
+ gdb::block_signals blocker;
-#ifdef HAVE_SIGPROCMASK
- sigprocmask (SIG_SETMASK, &prev_mask, NULL);
-#endif
+ /* scm_with_guile is the most portable way to initialize Guile.
+ Plus we need to initialize the Guile support while in Guile mode
+ (e.g., called from within a call to scm_with_guile). */
+ scm_with_guile (call_initialize_gdb_module, NULL);
+ }
/* Set Guile's backtrace to match the "set guile print-stack" default.
[N.B. The two settings are still separate.]