+2018-10-23 Simon Marchi <simon.marchi@polymtl.ca>
+
+ PR gdb/23368
+ * infrun.c (follow_exec): In the follow_exec_mode_new case,
+ transfer terminal state from old new new inferior.
+ * terminal.h (swap_terminal_info): New function.
+ * inflow.c (swap_terminal_info): New function.
+
2018-10-23 Tom Tromey <tom@tromey.com>
* record-btrace.c (get_thread_current_frame_id): Rename from
to->terminal_state = from->terminal_state;
}
+/* See terminal.h. */
+
+void
+swap_terminal_info (inferior *a, inferior *b)
+{
+ terminal_info *info_a
+ = (terminal_info *) inferior_data (a, inflow_inferior_data);
+ terminal_info *info_b
+ = (terminal_info *) inferior_data (a, inflow_inferior_data);
+
+ set_inferior_data (a, inflow_inferior_data, info_b);
+ set_inferior_data (b, inflow_inferior_data, info_a);
+
+ std::swap (a->terminal_state, b->terminal_state);
+}
+
void
info_terminal_command (const char *arg, int from_tty)
{
/* The user wants to keep the old inferior and program spaces
around. Create a new fresh one, and switch to it. */
- /* Do exit processing for the original inferior before adding
- the new inferior so we don't have two active inferiors with
- the same ptid, which can confuse find_inferior_ptid. */
+ /* Do exit processing for the original inferior before setting the new
+ inferior's pid. Having two inferiors with the same pid would confuse
+ find_inferior_p(t)id. Transfer the terminal state and info from the
+ old to the new inferior. */
+ inf = add_inferior_with_spaces ();
+ swap_terminal_info (inf, current_inferior ());
exit_inferior_silent (current_inferior ());
- inf = add_inferior_with_spaces ();
inf->pid = pid;
target_follow_exec (inf, exec_file_target);
extern void copy_terminal_info (struct inferior *to, struct inferior *from);
+/* Exchange the terminal info and state between inferiors A and B. */
+extern void swap_terminal_info (inferior *a, inferior *b);
+
extern pid_t create_tty_session (void);
/* Set up a serial structure describing standard input. In inflow.c. */