diff options
-rw-r--r-- | gdb/ChangeLog | 10 | ||||
-rw-r--r-- | gdbsupport/scoped_ignore_signal.h | 18 | ||||
-rw-r--r-- | gdbsupport/scoped_ignore_sigttou.h | 2 |
3 files changed, 24 insertions, 6 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e4e5817..c70f6ef 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,15 @@ 2021-06-17 Pedro Alves <pedro@palves.net> + * scoped_ignore_signal.h (scoped_ignore_signal): Add + ConsumePending template parameter. + (scoped_ignore_signal::~scoped_ignore_signal): Skip calling + sigtimedwait if ConsumePending is false. + (scoped_ignore_sigpipe): Initialize with ConsumePending=true. + * scoped_ignore_sigttou.h (scoped_ignore_sigttou) + <m_ignore_signal>: Initialize with ConsumePending=false. + +2021-06-17 Pedro Alves <pedro@palves.net> + * Makefile.in (SELFTESTS_SRCS): Add unittests/scoped_ignore_signal-selftests.c. * unittests/scoped_ignore_signal-selftests.c: New. diff --git a/gdbsupport/scoped_ignore_signal.h b/gdbsupport/scoped_ignore_signal.h index 55a921c..a14c967 100644 --- a/gdbsupport/scoped_ignore_signal.h +++ b/gdbsupport/scoped_ignore_signal.h @@ -25,9 +25,16 @@ /* RAII class used to ignore a signal in a scope. If sigprocmask is supported, then the signal is only ignored by the calling thread. Otherwise, the signal disposition is set to SIG_IGN, which affects - the whole process. */ - -template <int Sig> + the whole process. If ConsumePending is true, the destructor + consumes a pending Sig. SIGPIPE for example is queued on the + thread even if blocked at the time the pipe is written to. SIGTTOU + OTOH is not raised at all if the thread writing to the terminal has + it blocked. Because SIGTTOU is sent to the whole process instead + of to a specific thread, consuming a pending SIGTTOU in the + destructor could consume a signal raised due to actions done by + some other thread. */ + +template <int Sig, bool ConsumePending> class scoped_ignore_signal { public: @@ -58,7 +65,8 @@ public: /* If we got a pending Sig signal, consume it before unblocking. */ - sigtimedwait (&set, nullptr, &zero_timeout); + if (ConsumePending) + sigtimedwait (&set, nullptr, &zero_timeout); sigprocmask (SIG_UNBLOCK, &set, nullptr); } @@ -89,7 +97,7 @@ struct scoped_ignore_signal_nop }; #ifdef SIGPIPE -using scoped_ignore_sigpipe = scoped_ignore_signal<SIGPIPE>; +using scoped_ignore_sigpipe = scoped_ignore_signal<SIGPIPE, true>; #else using scoped_ignore_sigpipe = scoped_ignore_signal_nop; #endif diff --git a/gdbsupport/scoped_ignore_sigttou.h b/gdbsupport/scoped_ignore_sigttou.h index 1fc8f80..5695c5d 100644 --- a/gdbsupport/scoped_ignore_sigttou.h +++ b/gdbsupport/scoped_ignore_sigttou.h @@ -75,7 +75,7 @@ public: DISABLE_COPY_AND_ASSIGN (scoped_ignore_sigttou); private: - lazy_init<scoped_ignore_signal<SIGTTOU>> m_ignore_signal; + lazy_init<scoped_ignore_signal<SIGTTOU, false>> m_ignore_signal; }; #else |