From e714e1bf77429248e080fee199c87376a8649184 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Fri, 20 Jan 2012 09:42:44 +0000 Subject: [PATCH] 2012-01-20 Pedro Alves Ulrich Weigand * inferior.h (struct inferior): Add fake_pid_p. * inferior.c (exit_inferior_1): Clear fake_pid_p. * remote.c (remote_start_remote): Set fake_pid_p if we have to use magic_null_ptid since the remote side doesn't provide a real PID. --- gdb/ChangeLog | 8 ++++++++ gdb/inferior.c | 1 + gdb/inferior.h | 2 ++ gdb/remote.c | 42 ++++++++++++++++++++++++++++++++---------- 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c241643e82f..975fd75f611 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2012-01-20 Pedro Alves + Ulrich Weigand + + * inferior.h (struct inferior): Add fake_pid_p. + * inferior.c (exit_inferior_1): Clear fake_pid_p. + * remote.c (remote_start_remote): Set fake_pid_p if we have to use + magic_null_ptid since the remote side doesn't provide a real PID. + 2012-01-19 Tom Tromey * NEWS: Combine the two Python sections. diff --git a/gdb/inferior.c b/gdb/inferior.c index 65948c49050..4df8c774627 100644 --- a/gdb/inferior.c +++ b/gdb/inferior.c @@ -276,6 +276,7 @@ exit_inferior_1 (struct inferior *inftoex, int silent) observer_notify_inferior_exit (inf); inf->pid = 0; + inf->fake_pid_p = 0; if (inf->vfork_parent != NULL) { inf->vfork_parent->vfork_child = NULL; diff --git a/gdb/inferior.h b/gdb/inferior.h index f05789f224a..7857cbf7249 100644 --- a/gdb/inferior.h +++ b/gdb/inferior.h @@ -421,6 +421,8 @@ struct inferior /* Actual target inferior id, usually, a process id. This matches the ptid_t.pid member of threads of this inferior. */ int pid; + /* True if the PID was actually faked by GDB. */ + int fake_pid_p; /* State of GDB control of inferior process execution. See `struct inferior_control_state'. */ diff --git a/gdb/remote.c b/gdb/remote.c index 60d7ecdef90..3a9e2f6ff0a 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -3253,6 +3253,10 @@ remote_start_remote (int from_tty, struct target_ops *target, int extended_p) if (!non_stop) { + ptid_t ptid; + int fake_pid_p = 0; + struct inferior *inf; + if (rs->buf[0] == 'W' || rs->buf[0] == 'X') { if (!extended_p) @@ -3272,19 +3276,37 @@ remote_start_remote (int from_tty, struct target_ops *target, int extended_p) /* Let the stub know that we want it to return the thread. */ set_continue_thread (minus_one_ptid); - /* Without this, some commands which require an active target - (such as kill) won't work. This variable serves (at least) - double duty as both the pid of the target process (if it has - such), and as a flag indicating that a target is active. - These functions should be split out into seperate variables, - especially since GDB will someday have a notion of debugging - several processes. */ - inferior_ptid = magic_null_ptid; + inferior_ptid = minus_one_ptid; /* Now, if we have thread information, update inferior_ptid. */ - inferior_ptid = remote_current_thread (inferior_ptid); + ptid = remote_current_thread (inferior_ptid); + if (!ptid_equal (ptid, minus_one_ptid)) + { + if (ptid_get_pid (ptid) == -1) + { + ptid = ptid_build (ptid_get_pid (magic_null_ptid), + ptid_get_lwp (ptid), + ptid_get_tid (ptid)); + fake_pid_p = 1; + } + + inferior_ptid = ptid; + } + else + { + /* Without this, some commands which require an active + target (such as kill) won't work. This variable serves + (at least) double duty as both the pid of the target + process (if it has such), and as a flag indicating that a + target is active. These functions should be split out + into seperate variables, especially since GDB will + someday have a notion of debugging several processes. */ + inferior_ptid = magic_null_ptid; + fake_pid_p = 1; + } - remote_add_inferior (ptid_get_pid (inferior_ptid), -1); + inf = remote_add_inferior (ptid_get_pid (inferior_ptid), -1); + inf->fake_pid_p = fake_pid_p; /* Always add the main thread. */ add_thread_silent (inferior_ptid); -- 2.30.2