aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/inflow.c16
-rw-r--r--gdb/infrun.c10
-rw-r--r--gdb/terminal.h3
4 files changed, 33 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 19a87f4..5ef217d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,11 @@
+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
diff --git a/gdb/inflow.c b/gdb/inflow.c
index caff646..a0c1c7d 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 72e2496..9473d1f 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 7774eef..da27e46 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. */