diff options
author | Pedro Alves <pedro@palves.net> | 2021-06-17 16:16:54 +0100 |
---|---|---|
committer | Pedro Alves <pedro@palves.net> | 2021-06-17 16:22:11 +0100 |
commit | 6a7f1c20e82c349a2d4c977a27319e895e8ca284 (patch) | |
tree | 6210ff7bd225b3fcefd8d5b9047cfefffbdca2be /gdbsupport/scoped_ignore_sigttou.h | |
parent | 965febe599ab3a5f9fa17a7aaed4dd714f265ecd (diff) | |
download | binutils-gdb-6a7f1c20e82c349a2d4c977a27319e895e8ca284.tar.gz |
Introduce scoped_restore_signal
We currently have scoped_restore_sigttou and scoped_restore_sigpipe
doing basically the same thing -- temporarily ignoring a specific
signal.
This patch introduce a scoped_restore_signal type that can be used for
both. This will become more important for the next patch which
changes how the signal-ignoring is implemented.
scoped_restore_sigpipe is a straight alias to
scoped_restore_signal<SIGPIPE> on systems that define SIGPIPE, and an
alias to scoped_restore_signal_nop (a no-op version of
scoped_restore_signal) otherwise.
scoped_restore_sigttou is not a straight alias because it wants to
check the job_control global.
gdb/ChangeLog:
yyyy-mm-dd Pedro Alves <pedro@palves.net>
* gdbsupport/scoped_ignore_signal.h: New.
* compile/compile.c: Include gdbsupport/scoped_ignore_signal.h
instead of <signal.h>. Don't include <unistd.h>.
(scoped_ignore_sigpipe): Remove.
* gdbsupport/scoped_ignore_sigttou.h: Include gdbsupport/scoped_ignore_signal.h
instead of <signal.h>. Don't include <unistd.h>.
(lazy_init): New.
(scoped_ignore_sigttou): Reimplement using scoped_ignore_signal
and lazy_init.
Change-Id: Ibb44d0bd705e96df03ef0787c77358a4a7b7086c
Diffstat (limited to 'gdbsupport/scoped_ignore_sigttou.h')
-rw-r--r-- | gdbsupport/scoped_ignore_sigttou.h | 55 |
1 files changed, 43 insertions, 12 deletions
diff --git a/gdbsupport/scoped_ignore_sigttou.h b/gdbsupport/scoped_ignore_sigttou.h index a31316460b4..1fc8f80d7fd 100644 --- a/gdbsupport/scoped_ignore_sigttou.h +++ b/gdbsupport/scoped_ignore_sigttou.h @@ -20,37 +20,68 @@ #ifndef SCOPED_IGNORE_SIGTTOU_H #define SCOPED_IGNORE_SIGTTOU_H -#include <unistd.h> -#include <signal.h> +#include "gdbsupport/scoped_ignore_signal.h" #include "gdbsupport/job-control.h" -/* RAII class used to ignore SIGTTOU in a scope. */ +#ifdef SIGTTOU + +/* Simple wrapper that allows lazy initialization / destruction of T. + Slightly more efficient than gdb::optional, because it doesn't + carry storage to track whether the object has been initialized. */ +template<typename T> +class lazy_init +{ +public: + void emplace () + { + new (&m_u.obj) T (); + } + + void reset () + { + m_u.obj.~T (); + } + +private: + union u + { + /* Must define ctor/dtor if T has non-trivial ctor/dtor. */ + u () {} + ~u () {} + + T obj; + } m_u; +}; + +/* RAII class used to ignore SIGTTOU in a scope. This isn't simply + scoped_ignore_signal<SIGTTOU> because we want to check the + `job_control' global. */ class scoped_ignore_sigttou { public: scoped_ignore_sigttou () { -#ifdef SIGTTOU if (job_control) - m_osigttou = signal (SIGTTOU, SIG_IGN); -#endif + m_ignore_signal.emplace (); } ~scoped_ignore_sigttou () { -#ifdef SIGTTOU if (job_control) - signal (SIGTTOU, m_osigttou); -#endif + m_ignore_signal.reset (); } DISABLE_COPY_AND_ASSIGN (scoped_ignore_sigttou); private: -#ifdef SIGTTOU - sighandler_t m_osigttou = NULL; -#endif + lazy_init<scoped_ignore_signal<SIGTTOU>> m_ignore_signal; }; +#else + +using scoped_ignore_sigttou = scoped_ignore_signal_nop; + +#endif + #endif /* SCOPED_IGNORE_SIGTTOU_H */ |