gdb: fall back on sigpending + sigwait if sigtimedwait is not available
authorSimon Marchi <simon.marchi@polymtl.ca>
Mon, 5 Jul 2021 13:56:10 +0000 (09:56 -0400)
committerSimon Marchi <simon.marchi@polymtl.ca>
Mon, 5 Jul 2021 13:56:10 +0000 (09:56 -0400)
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>
gdbsupport/ChangeLog
gdbsupport/scoped_ignore_signal.h

index afe9171ff756336a9f39a8aa03594ea92da14436..bb54ff82f866812e0a1d853ec8b9a9af4a3694a4 100644 (file)
@@ -1,3 +1,9 @@
+2021-07-05  Simon Marchi  <simon.marchi@polymtl.ca>
+
+       * scoped_ignore_signal.h (struct scoped_ignore_signal)
+       <~scoped_ignore_signal>: Use sigtimedwait if HAVE_SIGTIMEDWAIT
+       is defined, else use sigpending + sigwait.
+
 2021-07-05  Simon Marchi  <simon.marchi@polymtl.ca>
 
        * common.m4 (GDB_AC_COMMON): Check for sigtimedwait.
index a14c96779bf214d6a407dc2efcb8e3226c86347b..57dd4b6d4025654ee544353f934145620e2d610d 100644 (file)
@@ -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);
       }
This page took 0.025632 seconds and 4 git commands to generate.