gdb: Reorganize linux_nat_filter_event
Reorganize linux-nat.c:linux_nat_filter_event such that all the handling for events for LWPs not in the LWP list is together. This helps make a following patch clearer. The comments and debug messages have also been tweaked - the end goal is to have them synchronized with the gdbserver counterpart. Change-Id: I8586d8dcd76d8bd3795145e3056fc660e3b2cd22
This commit is contained in:
parent
b7b1008c0b
commit
1abeb1e90d
1 changed files with 41 additions and 36 deletions
|
@ -2776,46 +2776,51 @@ linux_nat_filter_event (int lwpid, int status)
|
|||
|
||||
lp = find_lwp_pid (ptid_t (lwpid));
|
||||
|
||||
/* Check for stop events reported by a process we didn't already
|
||||
know about - anything not already in our LWP list.
|
||||
|
||||
If we're expecting to receive stopped processes after
|
||||
fork, vfork, and clone events, then we'll just add the
|
||||
new one to our list and go back to waiting for the event
|
||||
to be reported - the stopped process might be returned
|
||||
from waitpid before or after the event is.
|
||||
|
||||
But note the case of a non-leader thread exec'ing after the
|
||||
leader having exited, and gone from our lists. The non-leader
|
||||
thread changes its tid to the tgid. */
|
||||
|
||||
if (WIFSTOPPED (status) && lp == NULL
|
||||
&& (WSTOPSIG (status) == SIGTRAP && event == PTRACE_EVENT_EXEC))
|
||||
/* Check for events reported by anything not in our LWP list. */
|
||||
if (lp == nullptr)
|
||||
{
|
||||
/* A multi-thread exec after we had seen the leader exiting. */
|
||||
linux_nat_debug_printf ("Re-adding thread group leader LWP %d.", lwpid);
|
||||
if (WIFSTOPPED (status))
|
||||
{
|
||||
if (WSTOPSIG (status) == SIGTRAP && event == PTRACE_EVENT_EXEC)
|
||||
{
|
||||
/* A non-leader thread exec'ed after we've seen the
|
||||
leader zombie, and removed it from our lists (in
|
||||
check_zombie_leaders). The non-leader thread changes
|
||||
its tid to the tgid. */
|
||||
linux_nat_debug_printf
|
||||
("Re-adding thread group leader LWP %d after exec.",
|
||||
lwpid);
|
||||
|
||||
lp = add_lwp (ptid_t (lwpid, lwpid));
|
||||
lp->stopped = 1;
|
||||
lp->resumed = 1;
|
||||
add_thread (linux_target, lp->ptid);
|
||||
lp = add_lwp (ptid_t (lwpid, lwpid));
|
||||
lp->stopped = 1;
|
||||
lp->resumed = 1;
|
||||
add_thread (linux_target, lp->ptid);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* A process we are controlling has forked and the new
|
||||
child's stop was reported to us by the kernel. Save
|
||||
its PID and go back to waiting for the fork event to
|
||||
be reported - the stopped process might be returned
|
||||
from waitpid before or after the fork event is. */
|
||||
linux_nat_debug_printf
|
||||
("Saving LWP %d status %s in stopped_pids list",
|
||||
lwpid, status_to_str (status).c_str ());
|
||||
add_to_pid_list (&stopped_pids, lwpid, status);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Don't report an event for the exit of an LWP not in our
|
||||
list, i.e. not part of any inferior we're debugging.
|
||||
This can happen if we detach from a program we originally
|
||||
forked and then it exits. */
|
||||
}
|
||||
|
||||
if (lp == nullptr)
|
||||
return;
|
||||
}
|
||||
|
||||
if (WIFSTOPPED (status) && !lp)
|
||||
{
|
||||
linux_nat_debug_printf ("saving LWP %ld status %s in stopped_pids list",
|
||||
(long) lwpid, status_to_str (status).c_str ());
|
||||
add_to_pid_list (&stopped_pids, lwpid, status);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Make sure we don't report an event for the exit of an LWP not in
|
||||
our list, i.e. not part of the current process. This can happen
|
||||
if we detach from a program we originally forked and then it
|
||||
exits. */
|
||||
if (!WIFSTOPPED (status) && !lp)
|
||||
return;
|
||||
|
||||
/* This LWP is stopped now. (And if dead, this prevents it from
|
||||
ever being continued.) */
|
||||
lp->stopped = 1;
|
||||
|
|
Loading…
Add table
Reference in a new issue