From: Pedro Alves <pedro@palves.net>
To: John Baldwin <jhb@FreeBSD.org>,
Simon Marchi <simon.marchi@polymtl.ca>,
gdb-patches@sourceware.org
Subject: Re: [PATCH 3/4] scoped_ignore_signal: Use sigprocmask+sigtimedwait instead of signal
Date: Sun, 27 Jun 2021 15:55:03 +0100 [thread overview]
Message-ID: <5f2c10b5-035f-b66d-77c0-c141cc0e9d0c@palves.net> (raw)
In-Reply-To: <6dca033a-1b6f-05df-8dd0-e1cc2c7d85d2@FreeBSD.org>
On 2021-06-26 2:41 p.m., John Baldwin wrote:
> On 6/26/21 5:35 AM, Simon Marchi via Gdb-patches wrote:
>> On 2021-06-15 7:14 a.m., Pedro Alves wrote:
>>> The problem with using signal(...) to temporarily ignore a signal, is
>>> that that changes the the signal disposition for the whole process.
>>> If multiple threads do it at the same time, you have a race.
>>>
>>> Fix this by using sigprocmask + sigtimedwait to implement the ignoring
>>> instead, if available, which I think probably means everywhere except
>>> Windows nowadays. This way, we only change the signal mask for the
>>> current thread, so there's no race.
>>
>> I tried to build on macOS today and got:
>>
>>
>> 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);
>> ^
>>
>> I didn't have time to dig yet.
>
> It looks like macOS doesn't implement either sigtimedwait() or sigwaitinfo()
> which are part of POSIX from 1996 (*sigh*); however, macOS does provide
> sigpending() and sigwait(), so perhaps we can do something like:
>
> if (ConsumePending)
> {
> #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
> }
>
Thanks, that looks right to me. We're using sigtimewait with zero timeout to consume
a pending signal. sigpending + sigwait effectively does the same thing.
According to gnulib, sigpending exists everywhere but mingw:
https://www.gnu.org/software/gnulib/manual/html_node/sigpending.html
and sigtimedwait is missing on "Mac OS X 10.13, OpenBSD 6.7, Minix 3.1.8, Cygwin 2.9, mingw, MSVC 14, Android 5.1.":
https://www.gnu.org/software/gnulib/manual/html_node/sigtimedwait.html
So the approach you propose should work well.
Given sigpending is everywhere Unix-like, if we'd like, we could instead use the sigpending + sigwait path
unconditionally everywhere, but that's two syscalls instead of one, and the configure check is
trivial (just add sigtimedwait to AC_CHECK_FUNCS in gdbsupport/common.m4), so why not indeed save one
syscall, seems easy enough.
Let me know if you'd rather me do the leg work of writing the actual patch.
Pedro Alves
next prev parent reply other threads:[~2021-06-27 14:55 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-15 11:14 [PATCH 0/4] Introduce scoped_ignore_signal & make it thread safe Pedro Alves
2021-06-15 11:14 ` [PATCH 1/4] Move scoped_ignore_sigttou to gdbsupport/ Pedro Alves
2021-06-15 11:14 ` [PATCH 2/4] Introduce scoped_restore_signal Pedro Alves
2021-06-17 14:57 ` Pedro Alves
2021-06-15 11:14 ` [PATCH 3/4] scoped_ignore_signal: Use sigprocmask+sigtimedwait instead of signal Pedro Alves
2021-06-26 12:35 ` Simon Marchi via Gdb-patches
2021-06-26 13:41 ` John Baldwin
2021-06-26 19:10 ` Simon Marchi via Gdb-patches
2021-06-27 14:55 ` Pedro Alves [this message]
2021-06-27 19:01 ` Simon Marchi via Gdb-patches
2021-06-15 11:14 ` [PATCH 4/4] Add a unit test for scoped_ignore_sigpipe Pedro Alves
2021-06-15 22:26 ` Lancelot SIX via Gdb-patches
2021-06-17 13:00 ` Pedro Alves
2021-06-15 17:04 ` [PATCH 0/4] Introduce scoped_ignore_signal & make it thread safe John Baldwin
2021-06-17 14:38 ` Pedro Alves
2021-06-17 15:36 ` Pedro Alves
2021-06-17 16:45 ` John Baldwin
2021-06-17 18:44 ` [pushed] Don't call sigtimedwait for scoped_ignore_sigttou Pedro Alves
2021-06-15 20:16 ` [PATCH 0/4] Introduce scoped_ignore_signal & make it thread safe Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5f2c10b5-035f-b66d-77c0-c141cc0e9d0c@palves.net \
--to=pedro@palves.net \
--cc=gdb-patches@sourceware.org \
--cc=jhb@FreeBSD.org \
--cc=simon.marchi@polymtl.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox