X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Finflow.c;h=1b8e819436a2dc628dab88d24673e7dc0b698d5c;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=a3b5ba8abef83e16e0293083d69475d6d96f3d8e;hpb=d7e15655a40e9133a1cbf53ea071f82cd6745ac8;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/inflow.c b/gdb/inflow.c index a3b5ba8abe..1b8e819436 100644 --- a/gdb/inflow.c +++ b/gdb/inflow.c @@ -1,5 +1,5 @@ /* Low level interface to ptrace, for GDB when running under Unix. - Copyright (C) 1986-2018 Free Software Foundation, Inc. + Copyright (C) 1986-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -27,14 +27,14 @@ #include "observable.h" #include #include -#include "gdb_select.h" +#include "gdbsupport/gdb_select.h" #include "inflow.h" #include "gdbcmd.h" #ifdef HAVE_TERMIOS_H #include #endif -#include "job-control.h" +#include "gdbsupport/job-control.h" #ifdef HAVE_SYS_IOCTL_H #include @@ -58,13 +58,18 @@ static struct serial *stdin_serial; the inferior is resumed in the foreground. */ struct terminal_info { + terminal_info () = default; + ~terminal_info (); + + terminal_info &operator= (const terminal_info &) = default; + /* The name of the tty (from the `tty' command) that we gave to the inferior when it was started. */ - char *run_terminal; + char *run_terminal = nullptr; /* TTY state. We save it whenever the inferior stops, and restore it when it resumes in the foreground. */ - serial_ttystate ttystate; + serial_ttystate ttystate {}; #ifdef HAVE_TERMIOS_H /* The terminal's foreground process group. Saved whenever the @@ -80,11 +85,11 @@ struct terminal_info inf2's pgrp in the foreground instead of inf1's (which would be problematic since it would be left stopped: Ctrl-C wouldn't work, for example). */ - pid_t process_group; + pid_t process_group = 0; #endif /* fcntl flags. Saved and restored just like ttystate. */ - int tflags; + int tflags = 0; }; /* Our own tty state, which we restore every time we need to deal with @@ -103,42 +108,15 @@ static serial_ttystate initial_gdb_ttystate; static struct terminal_info *get_inflow_inferior_data (struct inferior *); -/* RAII class used to ignore SIGTTOU in a scope. */ - -class scoped_ignore_sigttou -{ -public: - scoped_ignore_sigttou () - { -#ifdef SIGTTOU - if (job_control) - m_osigttou = signal (SIGTTOU, SIG_IGN); -#endif - } - - ~scoped_ignore_sigttou () - { -#ifdef SIGTTOU - if (job_control) - signal (SIGTTOU, m_osigttou); -#endif - } - - DISABLE_COPY_AND_ASSIGN (scoped_ignore_sigttou); - -private: -#ifdef SIGTTOU - sighandler_t m_osigttou = NULL; -#endif -}; - /* While the inferior is running, we want SIGINT and SIGQUIT to go to the inferior only. If we have job control, that takes care of it. If not, we save our handlers in these two variables and set SIGINT and SIGQUIT to SIG_IGN. */ static sighandler_t sigint_ours; +#ifdef SIGQUIT static sighandler_t sigquit_ours; +#endif /* The name of the tty (from the `tty' command) that we're giving to the inferior when starting it up. This is only (and should only @@ -544,9 +522,8 @@ void child_interrupt (struct target_ops *self) { /* Interrupt the first inferior that has a resumed thread. */ - thread_info *thr; thread_info *resumed = NULL; - ALL_NON_EXITED_THREADS (thr) + for (thread_info *thr : all_non_exited_threads ()) { if (thr->executing) { @@ -603,8 +580,7 @@ child_pass_ctrlc (struct target_ops *self) /* Otherwise, pass the Ctrl-C to the first inferior that was resumed in the foreground. */ - inferior *inf; - ALL_INFERIORS (inf) + for (inferior *inf : all_inferiors ()) { if (inf->terminal_state != target_terminal_state::is_ours) { @@ -623,16 +599,12 @@ child_pass_ctrlc (struct target_ops *self) } /* Per-inferior data key. */ -static const struct inferior_data *inflow_inferior_data; +static const struct inferior_key inflow_inferior_data; -static void -inflow_inferior_data_cleanup (struct inferior *inf, void *arg) +terminal_info::~terminal_info () { - struct terminal_info *info = (struct terminal_info *) arg; - - xfree (info->run_terminal); - xfree (info->ttystate); - xfree (info); + xfree (run_terminal); + xfree (ttystate); } /* Get the current svr4 data. If none is found yet, add it now. This @@ -643,12 +615,9 @@ get_inflow_inferior_data (struct inferior *inf) { struct terminal_info *info; - info = (struct terminal_info *) inferior_data (inf, inflow_inferior_data); + info = inflow_inferior_data.get (inf); if (info == NULL) - { - info = XCNEW (struct terminal_info); - set_inferior_data (inf, inflow_inferior_data, info); - } + info = inflow_inferior_data.emplace (inf); return info; } @@ -662,18 +631,8 @@ get_inflow_inferior_data (struct inferior *inf) static void inflow_inferior_exit (struct inferior *inf) { - struct terminal_info *info; - inf->terminal_state = target_terminal_state::is_ours; - - info = (struct terminal_info *) inferior_data (inf, inflow_inferior_data); - if (info != NULL) - { - xfree (info->run_terminal); - xfree (info->ttystate); - xfree (info); - set_inferior_data (inf, inflow_inferior_data, NULL); - } + inflow_inferior_data.clear (inf); } void @@ -700,7 +659,21 @@ copy_terminal_info (struct inferior *to, struct inferior *from) to->terminal_state = from->terminal_state; } +/* See terminal.h. */ + void +swap_terminal_info (inferior *a, inferior *b) +{ + terminal_info *info_a = inflow_inferior_data.get (a); + terminal_info *info_b = inflow_inferior_data.get (b); + + inflow_inferior_data.set (a, info_b); + inflow_inferior_data.set (b, info_a); + + std::swap (a->terminal_state, b->terminal_state); +} + +static void info_terminal_command (const char *arg, int from_tty) { target_terminal::info (arg, from_tty); @@ -825,11 +798,11 @@ check_syscall (const char *msg, int result) void new_tty (void) { - int tty; - if (inferior_thisrun_terminal == 0) return; #if !defined(__GO32__) && !defined(_WIN32) + int tty; + #ifdef TIOCNOTTY /* Disconnect the child process from our controlling terminal. On some systems (SVR4 for example), this may cause a SIGTTOU, so temporarily @@ -980,8 +953,9 @@ initialize_stdin_serial (void) stdin_serial = serial_fdopen (0); } +void _initialize_inflow (); void -_initialize_inflow (void) +_initialize_inflow () { add_info ("terminal", info_terminal_command, _("Print inferior's saved terminal status.")); @@ -990,7 +964,4 @@ _initialize_inflow (void) have_job_control (); gdb::observers::inferior_exit.attach (inflow_inferior_exit); - - inflow_inferior_data - = register_inferior_data_with_cleanup (NULL, inflow_inferior_data_cleanup); }