scoped_ignore_signal: Use sigprocmask+sigtimedwait instead of signal
authorPedro Alves <pedro@palves.net>
Thu, 17 Jun 2021 15:16:55 +0000 (16:16 +0100)
committerPedro Alves <pedro@palves.net>
Thu, 17 Jun 2021 15:22:12 +0000 (16:22 +0100)
commit606a431366407ca2f041206dd4708450c2edc318
tree5633ab257fb5343875cfcddb848c2c70f2f98760
parent6a7f1c20e82c349a2d4c977a27319e895e8ca284
scoped_ignore_signal: Use sigprocmask+sigtimedwait instead of signal

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.

Change-Id: Idfe3fb08327ef8cae926f3de9ee81c56a83b1738

gdbsupport/ChangeLog:
yyyy-mm-dd  Pedro Alves  <pedro@palves.net>

* scoped_ignore_signal.h
(scoped_ignore_signal::scoped_ignore_signal)
[HAVE_SIGPROCMASK]: Use sigprocmask to block the signal instead of
changing the signal disposition for the whole process.
(scoped_ignore_signal::~scoped_ignore_signal) [HAVE_SIGPROCMASK]:
Use sigtimedwait and sigprocmask to flush and unblock the signal.
gdbsupport/ChangeLog
gdbsupport/scoped_ignore_signal.h