[PATCH v2 02/13] gdb linux-nat: Convert linux_nat_event_pipe to the event_pipe class.
Andrew Burgess
aburgess@redhat.com
Wed Nov 24 13:07:30 GMT 2021
<--- It's nice to say _something_ in the commit message, even if it's
just a single sentence.
Otherwise, LGTM.
* John Baldwin <jhb@FreeBSD.org> [2021-08-03 11:49:49 -0700]:
> ---
> gdb/linux-nat.c | 59 ++++++++++++++-----------------------------------
> 1 file changed, 16 insertions(+), 43 deletions(-)
>
> diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
> index e4d0206eaac..5a176ac9208 100644
> --- a/gdb/linux-nat.c
> +++ b/gdb/linux-nat.c
> @@ -48,6 +48,7 @@
> #include <fcntl.h> /* for O_RDONLY */
> #include "inf-loop.h"
> #include "gdbsupport/event-loop.h"
> +#include "gdbsupport/event-pipe.h"
> #include "event-top.h"
> #include <pwd.h>
> #include <sys/types.h>
> @@ -110,11 +111,11 @@ and target events, so neither blocking waitpid nor sigsuspend are
> viable options. Instead, we should asynchronously notify the GDB main
> event loop whenever there's an unprocessed event from the target. We
> detect asynchronous target events by handling SIGCHLD signals. To
> -notify the event loop about target events, the self-pipe trick is used
> ---- a pipe is registered as waitable event source in the event loop,
> +notify the event loop about target events, an event pipe is used
> +--- the pipe is registered as waitable event source in the event loop,
> the event loop select/poll's on the read end of this pipe (as well on
> -other event sources, e.g., stdin), and the SIGCHLD handler writes a
> -byte to this pipe. This is more portable than relying on
> +other event sources, e.g., stdin), and the SIGCHLD handler marks the
> +event pipe to raise an event. This is more portable than relying on
> pselect/ppoll, since on kernels that lack those syscalls, libc
> emulates them with select/poll+sigprocmask, and that is racy
> (a.k.a. plain broken).
> @@ -217,26 +218,18 @@ static int report_thread_events;
>
> /* Async mode support. */
>
> -/* The read/write ends of the pipe registered as waitable file in the
> - event loop. */
> -static int linux_nat_event_pipe[2] = { -1, -1 };
> +/* The event pipe registered as a waitable file in the event loop. */
> +static event_pipe linux_nat_event_pipe;
>
> /* True if we're currently in async mode. */
> -#define linux_is_async_p() (linux_nat_event_pipe[0] != -1)
> +#define linux_is_async_p() (linux_nat_event_pipe.is_open ())
>
> /* Flush the event pipe. */
>
> static void
> async_file_flush (void)
> {
> - int ret;
> - char buf;
> -
> - do
> - {
> - ret = read (linux_nat_event_pipe[0], &buf, 1);
> - }
> - while (ret >= 0 || (ret == -1 && errno == EINTR));
> + linux_nat_event_pipe.flush ();
> }
>
> /* Put something (anything, doesn't matter what, or how much) in event
> @@ -246,21 +239,7 @@ async_file_flush (void)
> static void
> async_file_mark (void)
> {
> - int ret;
> -
> - /* It doesn't really matter what the pipe contains, as long we end
> - up with something in it. Might as well flush the previous
> - left-overs. */
> - async_file_flush ();
> -
> - do
> - {
> - ret = write (linux_nat_event_pipe[1], "+", 1);
> - }
> - while (ret == -1 && errno == EINTR);
> -
> - /* Ignore EAGAIN. If the pipe is full, the event loop will already
> - be awakened anyway. */
> + linux_nat_event_pipe.mark ();
> }
>
> static int kill_lwp (int lwpid, int signo);
> @@ -4192,7 +4171,7 @@ sigchld_handler (int signo)
> gdb_stdlog->write_async_safe ("sigchld\n", sizeof ("sigchld\n") - 1);
>
> if (signo == SIGCHLD
> - && linux_nat_event_pipe[0] != -1)
> + && linux_nat_event_pipe.is_open ())
> async_file_mark (); /* Let the event loop know that there are
> events to handle. */
>
> @@ -4224,19 +4203,13 @@ linux_async_pipe (int enable)
>
> if (enable)
> {
> - if (gdb_pipe_cloexec (linux_nat_event_pipe) == -1)
> + if (!linux_nat_event_pipe.open ())
> internal_error (__FILE__, __LINE__,
> "creating event pipe failed.");
> -
> - fcntl (linux_nat_event_pipe[0], F_SETFL, O_NONBLOCK);
> - fcntl (linux_nat_event_pipe[1], F_SETFL, O_NONBLOCK);
> }
> else
> {
> - close (linux_nat_event_pipe[0]);
> - close (linux_nat_event_pipe[1]);
> - linux_nat_event_pipe[0] = -1;
> - linux_nat_event_pipe[1] = -1;
> + linux_nat_event_pipe.close ();
> }
>
> restore_child_signals_mask (&prev_mask);
> @@ -4248,7 +4221,7 @@ linux_async_pipe (int enable)
> int
> linux_nat_target::async_wait_fd ()
> {
> - return linux_nat_event_pipe[0];
> + return linux_nat_event_pipe.event_fd ();
> }
>
> /* target_async implementation. */
> @@ -4260,7 +4233,7 @@ linux_nat_target::async (int enable)
> {
> if (!linux_async_pipe (1))
> {
> - add_file_handler (linux_nat_event_pipe[0],
> + add_file_handler (linux_nat_event_pipe.event_fd (),
> handle_target_event, NULL,
> "linux-nat");
> /* There may be pending events to handle. Tell the event loop
> @@ -4270,7 +4243,7 @@ linux_nat_target::async (int enable)
> }
> else
> {
> - delete_file_handler (linux_nat_event_pipe[0]);
> + delete_file_handler (linux_nat_event_pipe.event_fd ());
> linux_async_pipe (0);
> }
> return;
> --
> 2.31.1
>
More information about the Gdb-patches
mailing list