OSDN Git Service

2012-01-20 Pedro Alves <palves@redhat.com>
authoruweigand <uweigand>
Fri, 20 Jan 2012 09:42:43 +0000 (09:42 +0000)
committeruweigand <uweigand>
Fri, 20 Jan 2012 09:42:43 +0000 (09:42 +0000)
    Ulrich Weigand  <ulrich.weigand@linaro.org>

* 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
gdb/inferior.c
gdb/inferior.h
gdb/remote.c

index c241643..975fd75 100644 (file)
@@ -1,3 +1,11 @@
+2012-01-20  Pedro Alves  <palves@redhat.com>
+           Ulrich Weigand  <ulrich.weigand@linaro.org>
+
+       * 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  <tromey@redhat.com>
 
        * NEWS: Combine the two Python sections.
index 65948c4..4df8c77 100644 (file)
@@ -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;
index f05789f..7857cbf 100644 (file)
@@ -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'.  */
index 60d7ecd..3a9e2f6 100644 (file)
@@ -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);