diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 19a87f40fe..5ef217d446 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2018-10-23 Simon Marchi + + 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 * record-btrace.c (get_thread_current_frame_id): Rename from diff --git a/gdb/inflow.c b/gdb/inflow.c index caff646207..a0c1c7d884 100644 --- a/gdb/inflow.c +++ b/gdb/inflow.c @@ -702,6 +702,22 @@ 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 + = (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) { diff --git a/gdb/infrun.c b/gdb/infrun.c index 72e2496176..9473d1f20f 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -1189,12 +1189,14 @@ follow_exec (ptid_t ptid, char *exec_file_target) /* 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); diff --git a/gdb/terminal.h b/gdb/terminal.h index 7774eefcd4..da27e46f6e 100644 --- a/gdb/terminal.h +++ b/gdb/terminal.h @@ -29,6 +29,9 @@ extern void new_tty_postfork (void); 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. */