gdb: don't use inferior_ptid in linux_nat_wait_1
authorSimon Marchi <simon.marchi@polymtl.ca>
Mon, 14 Sep 2020 15:51:04 +0000 (11:51 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Mon, 14 Sep 2020 15:51:21 +0000 (11:51 -0400)
target_ops::wait implementations should not rely on the value of
inferior_ptid on entry.  While looking at another wait-related patch, I
noticed that the code in linux_nat_wait_1, checking for a newly created
process, did just that.  This patch fixes it.  Note that I didn't see
any bug, this "fix" is simply to make the function respect the
target_ops::wait contract.

Instead of checking inferior_ptid, check for the passed in `ptid`
value.

During startup, linux_nat_wait_1 gets called a few times with the
pid-only ptid, while startup_inferior waits for the expected number of
exec events.  For this reason, I needed to add a `find_lwp_pid` call to
ensure that the actions of changing the main thread's ptid, and adding
the initial lwp, were done only once for a given process.

This was not needed before, since thread_change_ptid, through the
thread_ptid_changed observer, ends up changing inferior_ptid.  So the
second time around, inferior_ptid was not a pid-only ptid.

That find_lwp_pid won't add much overhead, as it will only be called
when the ptid is a pid-only ptid.  And AFAIK, that only happens during
inferior startup.

An alternative to that `find_lwp_pid` call might be to make
startup_inferior realize that the main thread has changed ptid, and make
it wait for the new ptid.  But that doesn't look easy to do.

Regtested on amd64/Linux.

gdb/ChangeLog:

* linux-nat.c (linux_nat_wait_1): Don't use inferior_ptid when
checking for initial lwp.

Change-Id: I8f1d5c766f5cb2a29c948bc75fa4582d7130c23f

gdb/ChangeLog
gdb/linux-nat.c

index dabc7266dba458759fb1cceedcd698bd00541c69..c60d20b9a695711ea2109b0bb5b06d0d2306fb80 100644 (file)
@@ -1,3 +1,8 @@
+2020-09-14  Simon Marchi  <simon.marchi@polymtl.ca>
+
+       * linux-nat.c (linux_nat_wait_1): Don't use inferior_ptid when
+       checking for initial lwp.
+
 2020-09-14  Tom Tromey  <tromey@adacore.com>
 
        * m68k-tdep.c (m68k_extract_return_value): Use
index b81014024c7a6eba0e805c7ea18c3f839e9bd98f..4f53670da5e34cab07656b0637cdbcc24841ae51 100644 (file)
@@ -3143,14 +3143,13 @@ linux_nat_wait_1 (ptid_t ptid, struct target_waitstatus *ourstatus,
   /* The first time we get here after starting a new inferior, we may
      not have added it to the LWP list yet - this is the earliest
      moment at which we know its PID.  */
-  if (inferior_ptid.is_pid ())
+  if (ptid.is_pid () && find_lwp_pid (ptid) == nullptr)
     {
-      /* Upgrade the main thread's ptid.  */
-      thread_change_ptid (linux_target, inferior_ptid,
-                         ptid_t (inferior_ptid.pid (),
-                                 inferior_ptid.pid (), 0));
+      ptid_t lwp_ptid (ptid.pid (), ptid.pid ());
 
-      lp = add_initial_lwp (inferior_ptid);
+      /* Upgrade the main thread's ptid.  */
+      thread_change_ptid (linux_target, ptid, lwp_ptid);
+      lp = add_initial_lwp (lwp_ptid);
       lp->resumed = 1;
     }