From e17c9e56cb62a1791215b8a144ef864f77e4a34f Mon Sep 17 00:00:00 2001 From: Hui Zhu Date: Tue, 18 May 2010 02:47:45 +0000 Subject: [PATCH] 2010-05-18 Hui Zhu * 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. --- gdb/ChangeLog | 8 ++++++++ gdb/linux-fork.c | 35 ++++++++++++++++++++--------------- 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 + + * 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 * 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)); } } -- 2.7.4