gdb: don't use inferior_ptid in linux_nat_wait_1

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
This commit is contained in:
Simon Marchi 2020-09-14 11:51:04 -04:00 committed by Simon Marchi
parent 3eba3a011a
commit 677c92fe9a
2 changed files with 10 additions and 6 deletions

View 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

View 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;
}