aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorHui Zhu <teawater@gmail.com>2010-05-18 02:47:45 +0000
committerHui Zhu <teawater@gmail.com>2010-05-18 02:47:45 +0000
commite17c9e56cb62a1791215b8a144ef864f77e4a34f (patch)
treeefd68eb6960f042f5664e925a092d898cdb5f482 /gdb
parent1a24cf0e5baf866d7a4ce497a721a42693be5d07 (diff)
downloadgdb-e17c9e56cb62a1791215b8a144ef864f77e4a34f.zip
gdb-e17c9e56cb62a1791215b8a144ef864f77e4a34f.tar.gz
gdb-e17c9e56cb62a1791215b8a144ef864f77e4a34f.tar.bz2
2010-05-18 Hui Zhu <teawater@gmail.com>
* linux-fork.c (inferior_call_waitpid_cleanup): Add check for oldfp. (inferior_call_waitpid): Move make_cleanup out of check. Check the return of waitpid. (delete_checkpoint_command): Add pptid to save fi->parent_ptid.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/linux-fork.c35
2 files changed, 28 insertions, 15 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 97675f5..25a76ca 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,11 @@
+2010-05-18 Hui Zhu <teawater@gmail.com>
+
+ * linux-fork.c (inferior_call_waitpid_cleanup): Add check
+ for oldfp.
+ (inferior_call_waitpid): Move make_cleanup out of check.
+ Check the return of waitpid.
+ (delete_checkpoint_command): Add pptid to save fi->parent_ptid.
+
2010-05-17 Michael Snyder <msnyder@vmware.com>
* tui/tui.c: White space.
diff --git a/gdb/linux-fork.c b/gdb/linux-fork.c
index 9d20128..d9463bd 100644
--- a/gdb/linux-fork.c
+++ b/gdb/linux-fork.c
@@ -417,10 +417,13 @@ inferior_call_waitpid_cleanup (void *fp)
{
struct fork_info *oldfp = fp;
- /* Switch back to inferior_ptid. */
- remove_breakpoints ();
- fork_load_infrun_state (oldfp);
- insert_breakpoints ();
+ if (oldfp)
+ {
+ /* Switch back to inferior_ptid. */
+ remove_breakpoints ();
+ fork_load_infrun_state (oldfp);
+ insert_breakpoints ();
+ }
}
static int
@@ -428,10 +431,10 @@ inferior_call_waitpid (ptid_t pptid, int pid)
{
struct objfile *waitpid_objf;
struct value *waitpid_fn = NULL;
- struct value *argv[4];
+ struct value *argv[4], *retv;
struct gdbarch *gdbarch = get_current_arch ();
struct fork_info *oldfp = NULL, *newfp = NULL;
- struct cleanup *old_cleanup = NULL;
+ struct cleanup *old_cleanup;
int ret = -1;
if (!ptid_equal (pptid, inferior_ptid))
@@ -445,10 +448,10 @@ inferior_call_waitpid (ptid_t pptid, int pid)
remove_breakpoints ();
fork_load_infrun_state (newfp);
insert_breakpoints ();
-
- old_cleanup = make_cleanup (inferior_call_waitpid_cleanup, oldfp);
}
+ old_cleanup = make_cleanup (inferior_call_waitpid_cleanup, oldfp);
+
/* Get the waitpid_fn. */
if (lookup_minimal_symbol ("waitpid", NULL, NULL) != NULL)
waitpid_fn = find_function_in_inferior ("waitpid", &waitpid_objf);
@@ -463,13 +466,14 @@ inferior_call_waitpid (ptid_t pptid, int pid)
argv[2] = value_from_longest (builtin_type (gdbarch)->builtin_int, 0);
argv[3] = 0;
- call_function_by_hand (waitpid_fn, 3, argv);
+ retv = call_function_by_hand (waitpid_fn, 3, argv);
+ if (value_as_long (retv) < 0)
+ goto out;
ret = 0;
out:
- if (old_cleanup)
- do_cleanups (old_cleanup);
+ do_cleanups (old_cleanup);
return ret;
}
@@ -478,7 +482,7 @@ out:
static void
delete_checkpoint_command (char *args, int from_tty)
{
- ptid_t ptid;
+ ptid_t ptid, pptid;
struct fork_info *fi;
if (!args || !*args)
@@ -497,6 +501,7 @@ Please switch to another checkpoint before deleting the current one"));
fi = find_fork_ptid (ptid);
gdb_assert (fi);
+ pptid = fi->parent_ptid;
if (from_tty)
printf_filtered (_("Killed %s\n"), target_pid_to_str (ptid));
@@ -507,10 +512,10 @@ Please switch to another checkpoint before deleting the current one"));
list, waitpid the ptid.
If fi->parent_ptid is a part of lwp and it is stoped, waitpid the
ptid. */
- if ((!find_thread_ptid (fi->parent_ptid) && find_fork_ptid (fi->parent_ptid))
- || (find_thread_ptid (fi->parent_ptid) && is_stopped (fi->parent_ptid)))
+ if ((!find_thread_ptid (pptid) && find_fork_ptid (pptid))
+ || (find_thread_ptid (pptid) && is_stopped (pptid)))
{
- if (inferior_call_waitpid (fi->parent_ptid, PIDGET (ptid)))
+ if (inferior_call_waitpid (pptid, PIDGET (ptid)))
warning (_("Unable to wait pid %s"), target_pid_to_str (ptid));
}
}