aboutsummaryrefslogtreecommitdiff
path: root/gdbsupport/scoped_ignore_signal.h
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@polymtl.ca>2021-06-27 15:13:14 -0400
committerSimon Marchi <simon.marchi@polymtl.ca>2021-07-05 09:54:58 -0400
commit99624310dd82542c389c89c2e55d8cae36bb74e1 (patch)
tree2fa728a0011e50c3fd1e43edc54fc05c560748c5 /gdbsupport/scoped_ignore_signal.h
parentf4931779e4432bde7f04fd1a60a7f055f86e6ccb (diff)
downloadgdb-99624310dd82542c389c89c2e55d8cae36bb74e1.zip
gdb-99624310dd82542c389c89c2e55d8cae36bb74e1.tar.gz
gdb-99624310dd82542c389c89c2e55d8cae36bb74e1.tar.bz2
gdb: fall back on sigpending + sigwait if sigtimedwait is not available
The macOS platform does not provide sigtimedwait, so we get: CXX compile/compile.o In file included from /Users/smarchi/src/binutils-gdb/gdb/compile/compile.c:46: /Users/smarchi/src/binutils-gdb/gdb/../gdbsupport/scoped_ignore_signal.h:69:4: error: use of undeclared identifier 'sigtimedwait' sigtimedwait (&set, nullptr, &zero_timeout); ^ An alternative to sigtimedwait with a timeout of 0 is to use sigpending, to first check which signals are pending, and then sigwait, to consume them. Since that's slightly more expensive (2 syscalls instead of 1), keep using sigtimedwait for the platforms that provide it, and fall back to sigpending + sigwait for the others. gdbsupport/ChangeLog: * scoped_ignore_signal.h (struct scoped_ignore_signal) <~scoped_ignore_signal>: Use sigtimedwait if HAVE_SIGTIMEDWAIT is defined, else use sigpending + sigwait. Change-Id: I2a72798337e81dd1bbd21214736a139dd350af87 Co-Authored-By: John Baldwin <jhb@FreeBSD.org>
Diffstat (limited to 'gdbsupport/scoped_ignore_signal.h')
-rw-r--r--gdbsupport/scoped_ignore_signal.h15
1 files changed, 13 insertions, 2 deletions
diff --git a/gdbsupport/scoped_ignore_signal.h b/gdbsupport/scoped_ignore_signal.h
index a14c967..57dd4b6 100644
--- a/gdbsupport/scoped_ignore_signal.h
+++ b/gdbsupport/scoped_ignore_signal.h
@@ -58,7 +58,6 @@ public:
if (!m_was_blocked)
{
sigset_t set;
- const timespec zero_timeout = {};
sigemptyset (&set);
sigaddset (&set, Sig);
@@ -66,7 +65,19 @@ public:
/* If we got a pending Sig signal, consume it before
unblocking. */
if (ConsumePending)
- sigtimedwait (&set, nullptr, &zero_timeout);
+ {
+#ifdef HAVE_SIGTIMEDWAIT
+ const timespec zero_timeout = {};
+
+ sigtimedwait (&set, nullptr, &zero_timeout);
+#else
+ sigset_t pending;
+
+ sigpending (&pending);
+ if (sigismember (&pending, Sig))
+ sigwait (&set, nullptr);
+#endif
+ }
sigprocmask (SIG_UNBLOCK, &set, nullptr);
}