summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Snyder <msnyder@specifix.com>2006-03-10 20:15:42 +0000
committerMichael Snyder <msnyder@specifix.com>2006-03-10 20:15:42 +0000
commit282aeecb756c9a11ecb053629aa3d0f179f48b3a (patch)
treecf2f07523c54c34f227e25aaefc3e00230aa003a
parent5888ffe3776e8ee0417dd007d40279feb4952021 (diff)
downloadgdb-282aeecb756c9a11ecb053629aa3d0f179f48b3a.tar.gz
2006-03-09 Michael Snyder <msnyder@redhat.com>
* linux-nat.c (kill_inferior): Just call target_mourn_inferior instead of getting tricky for the multi-fork case. * linux-fork.c (linux_fork_killall): Call PT_KILL and waitpid for each fork, and then use init_fork_list to delete them.
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/linux-fork.c24
-rw-r--r--gdb/linux-nat.c4
3 files changed, 20 insertions, 15 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 6671148d8e4..4e215bc9b46 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,6 +1,9 @@
-2006-03-09 Joel Brobecker <brobecker@adacore.com>
+2006-03-09 Michael Snyder <msnyder@redhat.com>
- * MAINTAINERS (Patch Champions): Remove self.
+ * linux-nat.c (kill_inferior): Just call target_mourn_inferior
+ instead of getting tricky for the multi-fork case.
+ * linux-fork.c (linux_fork_killall): Call PT_KILL and waitpid
+ for each fork, and then use init_fork_list to delete them.
2006-03-08 Alexandre Oliva <aoliva@redhat.com>
diff --git a/gdb/linux-fork.c b/gdb/linux-fork.c
index 768c7da5957..f024490d1f9 100644
--- a/gdb/linux-fork.c
+++ b/gdb/linux-fork.c
@@ -72,8 +72,7 @@ add_fork (pid_t pid)
{
struct fork_info *fp;
- if (fork_list == NULL &&
- pid != PIDGET (inferior_ptid))
+ if (fork_list == NULL && pid != PIDGET (inferior_ptid))
{
/* Special case -- if this is the first fork in the list
(the list is hitherto empty), and if this new fork is
@@ -322,17 +321,22 @@ linux_fork_killall (void)
status for it) -- however any process may be a child
or a parent, so may get a SIGCHLD from a previously
killed child. Wait them all out. */
+ struct fork_info *fp;
pid_t pid, ret;
int status;
- do {
- pid = PIDGET (fork_list->ptid);
- do {
- ptrace (PT_KILL, pid, 0, 0);
- ret = waitpid (pid, &status, 0);
- } while (ret == pid && WIFSTOPPED (status));
- delete_fork (fork_list->ptid);
- } while (fork_list != NULL);
+ for (fp = fork_list; fp; fp = fp->next)
+ {
+ pid = PIDGET (fp->ptid);
+ do {
+ ptrace (PT_KILL, pid, 0, 0);
+ ret = waitpid (pid, &status, 0);
+ /* We might get a SIGCHLD instead of an exit status. This is
+ aggravated by the first kill above - a child has just
+ died. MVS comment cut-and-pasted from linux-nat. */
+ } while (ret == pid && WIFSTOPPED (status));
+ }
+ init_fork_list (); /* Clear list, prepare to start fresh. */
}
/* The current inferior_ptid has exited, but there are other viable
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index 0710ac718ac..2ba5d7d1647 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -616,8 +616,6 @@ kill_inferior (void)
if (forks_exist_p ())
{
linux_fork_killall ();
- pop_target ();
- generic_mourn_inferior ();
}
else
{
@@ -646,8 +644,8 @@ kill_inferior (void)
ptrace (PT_KILL, pid, 0, 0);
ret = wait (&status);
}
- target_mourn_inferior ();
}
+ target_mourn_inferior ();
}
/* On GNU/Linux there are no real LWP's. The closest thing to LWP's