gdb: make inferior::m_terminal an std::string

Same idea as the previous patch, but for m_terminal.

Change-Id: If9367d5db8c976a4336680adca4ea5bc31ab64d2
This commit is contained in:
Simon Marchi
2021-06-28 16:32:00 -04:00
parent 11bd012ed2
commit 4e93ea6e67
6 changed files with 41 additions and 51 deletions

View File

@ -115,13 +115,11 @@ show_inferior_tty_command (struct ui_file *file, int from_tty,
{ {
/* Note that we ignore the passed-in value in favor of computing it /* Note that we ignore the passed-in value in favor of computing it
directly. */ directly. */
const char *inferior_tty = current_inferior ()->tty (); const std::string &inferior_tty = current_inferior ()->tty ();
if (inferior_tty == nullptr)
inferior_tty = "";
fprintf_filtered (gdb_stdout, fprintf_filtered (gdb_stdout,
_("Terminal for future runs of program being debugged " _("Terminal for future runs of program being debugged "
"is \"%s\".\n"), inferior_tty); "is \"%s\".\n"), inferior_tty.c_str ());
} }
void void

View File

@ -111,18 +111,15 @@ inferior::unpush_target (struct target_ops *t)
} }
void void
inferior::set_tty (const char *terminal_name) inferior::set_tty (std::string terminal_name)
{ {
if (terminal_name != nullptr && *terminal_name != '\0') m_terminal = std::move (terminal_name);
m_terminal = make_unique_xstrdup (terminal_name);
else
m_terminal = NULL;
} }
const char * const std::string &
inferior::tty () inferior::tty ()
{ {
return m_terminal.get (); return m_terminal;
} }
void void

View File

@ -434,13 +434,15 @@ public:
void add_continuation (std::function<void ()> &&cont); void add_continuation (std::function<void ()> &&cont);
void do_all_continuations (); void do_all_continuations ();
/* Set/get file name for default use for standard in/out in the /* Set/get file name for default use for standard in/out in the inferior.
inferior. On Unix systems, we try to make TERMINAL_NAME the
inferior's controlling terminal. If TERMINAL_NAME is nullptr or On Unix systems, we try to make TERMINAL_NAME the inferior's controlling
the empty string, then the inferior inherits GDB's terminal (or terminal.
GDBserver's if spawning a remote process). */
void set_tty (const char *terminal_name); If TERMINAL_NAME is the empty string, then the inferior inherits GDB's
const char *tty (); terminal (or GDBserver's if spawning a remote process). */
void set_tty (std::string terminal_name);
const std::string &tty ();
/* Set the argument string to use when running this inferior. /* Set the argument string to use when running this inferior.
@ -587,7 +589,7 @@ private:
target_stack m_target_stack; target_stack m_target_stack;
/* The name of terminal device to use for I/O. */ /* The name of terminal device to use for I/O. */
gdb::unique_xmalloc_ptr<char> m_terminal; std::string m_terminal;
/* The list of continuations. */ /* The list of continuations. */
std::list<std::function<void ()>> m_continuations; std::list<std::function<void ()>> m_continuations;

View File

@ -65,7 +65,7 @@ struct terminal_info
/* The name of the tty (from the `tty' command) that we gave to the /* The name of the tty (from the `tty' command) that we gave to the
inferior when it was started. */ inferior when it was started. */
char *run_terminal = nullptr; std::string run_terminal;
/* TTY state. We save it whenever the inferior stops, and restore /* TTY state. We save it whenever the inferior stops, and restore
it when it resumes in the foreground. */ it when it resumes in the foreground. */
@ -123,7 +123,7 @@ static sighandler_t sigquit_ours;
be) used as a transient global by new_tty_prefork, be) used as a transient global by new_tty_prefork,
create_tty_session, new_tty and new_tty_postfork, all called from create_tty_session, new_tty and new_tty_postfork, all called from
fork_inferior, while forking a new child. */ fork_inferior, while forking a new child. */
static const char *inferior_thisrun_terminal; static std::string inferior_thisrun_terminal;
/* Track who owns GDB's terminal (is it GDB or some inferior?). While /* Track who owns GDB's terminal (is it GDB or some inferior?). While
target_terminal::is_ours() etc. tracks the core's intention and is target_terminal::is_ours() etc. tracks the core's intention and is
@ -303,8 +303,8 @@ sharing_input_terminal (inferior *inf)
output was redirected to our terminal), and with a false output was redirected to our terminal), and with a false
positive we just end up trying to save/restore terminal positive we just end up trying to save/restore terminal
settings when we didn't need to or we actually can't. */ settings when we didn't need to or we actually can't. */
if (tinfo->run_terminal != NULL) if (!tinfo->run_terminal.empty ())
res = is_gdb_terminal (tinfo->run_terminal); res = is_gdb_terminal (tinfo->run_terminal.c_str ());
/* If we still can't determine, assume yes. */ /* If we still can't determine, assume yes. */
if (res == TRIBOOL_UNKNOWN) if (res == TRIBOOL_UNKNOWN)
@ -603,7 +603,6 @@ static const struct inferior_key<terminal_info> inflow_inferior_data;
terminal_info::~terminal_info () terminal_info::~terminal_info ()
{ {
xfree (run_terminal);
xfree (ttystate); xfree (ttystate);
} }
@ -643,15 +642,10 @@ copy_terminal_info (struct inferior *to, struct inferior *from)
tinfo_to = get_inflow_inferior_data (to); tinfo_to = get_inflow_inferior_data (to);
tinfo_from = get_inflow_inferior_data (from); tinfo_from = get_inflow_inferior_data (from);
xfree (tinfo_to->run_terminal);
xfree (tinfo_to->ttystate); xfree (tinfo_to->ttystate);
*tinfo_to = *tinfo_from; *tinfo_to = *tinfo_from;
if (tinfo_from->run_terminal)
tinfo_to->run_terminal
= xstrdup (tinfo_from->run_terminal);
if (tinfo_from->ttystate) if (tinfo_from->ttystate)
tinfo_to->ttystate tinfo_to->ttystate
= serial_copy_tty_state (stdin_serial, tinfo_from->ttystate); = serial_copy_tty_state (stdin_serial, tinfo_from->ttystate);
@ -765,19 +759,19 @@ child_terminal_info (struct target_ops *self, const char *args, int from_tty)
/* NEW_TTY_PREFORK is called before forking a new child process, /* NEW_TTY_PREFORK is called before forking a new child process,
so we can record the state of ttys in the child to be formed. so we can record the state of ttys in the child to be formed.
TTYNAME is null if we are to share the terminal with gdb; TTYNAME is empty if we are to share the terminal with gdb;
or points to a string containing the name of the desired tty. otherwise it contains the name of the desired tty.
NEW_TTY is called in new child processes under Unix, which will NEW_TTY is called in new child processes under Unix, which will
become debugger target processes. This actually switches to become debugger target processes. This actually switches to
the terminal specified in the NEW_TTY_PREFORK call. */ the terminal specified in the NEW_TTY_PREFORK call. */
void void
new_tty_prefork (const char *ttyname) new_tty_prefork (std::string ttyname)
{ {
/* Save the name for later, for determining whether we and the child /* Save the name for later, for determining whether we and the child
are sharing a tty. */ are sharing a tty. */
inferior_thisrun_terminal = ttyname; inferior_thisrun_terminal = std::move (ttyname);
} }
#if !defined(__GO32__) && !defined(_WIN32) #if !defined(__GO32__) && !defined(_WIN32)
@ -798,7 +792,7 @@ check_syscall (const char *msg, int result)
void void
new_tty (void) new_tty (void)
{ {
if (inferior_thisrun_terminal == 0) if (inferior_thisrun_terminal.empty ())
return; return;
#if !defined(__GO32__) && !defined(_WIN32) #if !defined(__GO32__) && !defined(_WIN32)
int tty; int tty;
@ -818,8 +812,8 @@ new_tty (void)
#endif #endif
/* Now open the specified new terminal. */ /* Now open the specified new terminal. */
tty = open (inferior_thisrun_terminal, O_RDWR | O_NOCTTY); tty = open (inferior_thisrun_terminal.c_str (), O_RDWR | O_NOCTTY);
check_syscall (inferior_thisrun_terminal, tty); check_syscall (inferior_thisrun_terminal.c_str (), tty);
/* Avoid use of dup2; doesn't exist on all systems. */ /* Avoid use of dup2; doesn't exist on all systems. */
if (tty != 0) if (tty != 0)
@ -854,7 +848,7 @@ new_tty (void)
/* NEW_TTY_POSTFORK is called after forking a new child process, and /* NEW_TTY_POSTFORK is called after forking a new child process, and
adding it to the inferior table, to store the TTYNAME being used by adding it to the inferior table, to store the TTYNAME being used by
the child, or null if it sharing the terminal with gdb. */ the child, or empty if it sharing the terminal with gdb. */
void void
new_tty_postfork (void) new_tty_postfork (void)
@ -862,15 +856,11 @@ new_tty_postfork (void)
/* Save the name for later, for determining whether we and the child /* Save the name for later, for determining whether we and the child
are sharing a tty. */ are sharing a tty. */
if (inferior_thisrun_terminal) struct inferior *inf = current_inferior ();
{ struct terminal_info *tinfo = get_inflow_inferior_data (inf);
struct inferior *inf = current_inferior ();
struct terminal_info *tinfo = get_inflow_inferior_data (inf);
tinfo->run_terminal = xstrdup (inferior_thisrun_terminal); tinfo->run_terminal = std::move (inferior_thisrun_terminal);
} inferior_thisrun_terminal.clear ();
inferior_thisrun_terminal = NULL;
} }
@ -894,7 +884,7 @@ set_sigint_trap (void)
struct inferior *inf = current_inferior (); struct inferior *inf = current_inferior ();
struct terminal_info *tinfo = get_inflow_inferior_data (inf); struct terminal_info *tinfo = get_inflow_inferior_data (inf);
if (inf->attach_flag || tinfo->run_terminal) if (inf->attach_flag || !tinfo->run_terminal.empty ())
{ {
osig = signal (SIGINT, pass_signal); osig = signal (SIGINT, pass_signal);
osig_set = 1; osig_set = 1;
@ -927,7 +917,7 @@ create_tty_session (void)
#ifdef HAVE_SETSID #ifdef HAVE_SETSID
pid_t ret; pid_t ret;
if (!job_control || inferior_thisrun_terminal == 0) if (!job_control || inferior_thisrun_terminal.empty ())
return 0; return 0;
ret = setsid (); ret = setsid ();

View File

@ -244,7 +244,10 @@ mi_cmd_env_dir (const char *command, char **argv, int argc)
void void
mi_cmd_inferior_tty_set (const char *command, char **argv, int argc) mi_cmd_inferior_tty_set (const char *command, char **argv, int argc)
{ {
current_inferior ()->set_tty (argv[0]); if (argc > 0)
current_inferior ()->set_tty (argv[0]);
else
current_inferior ()->set_tty ("");
} }
/* Print the inferior terminal device name. */ /* Print the inferior terminal device name. */
@ -255,8 +258,8 @@ mi_cmd_inferior_tty_show (const char *command, char **argv, int argc)
if ( !mi_valid_noargs ("-inferior-tty-show", argc, argv)) if ( !mi_valid_noargs ("-inferior-tty-show", argc, argv))
error (_("-inferior-tty-show: Usage: No args")); error (_("-inferior-tty-show: Usage: No args"));
const char *inferior_tty = current_inferior ()->tty (); const std::string &inferior_tty = current_inferior ()->tty ();
if (inferior_tty != NULL) if (!inferior_tty.empty ())
current_uiout->field_string ("inferior_tty_terminal", inferior_tty); current_uiout->field_string ("inferior_tty_terminal", inferior_tty);
} }

View File

@ -21,7 +21,7 @@
struct inferior; struct inferior;
extern void new_tty_prefork (const char *); extern void new_tty_prefork (std::string ttyname);
extern void new_tty (void); extern void new_tty (void);