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.
This commit is contained in:
Hui Zhu 2010-05-18 02:47:45 +00:00
parent 1a24cf0e5b
commit e17c9e56cb
2 changed files with 28 additions and 15 deletions

View file

@ -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> 2010-05-17 Michael Snyder <msnyder@vmware.com>
* tui/tui.c: White space. * tui/tui.c: White space.

View file

@ -417,21 +417,24 @@ inferior_call_waitpid_cleanup (void *fp)
{ {
struct fork_info *oldfp = fp; struct fork_info *oldfp = fp;
if (oldfp)
{
/* Switch back to inferior_ptid. */ /* Switch back to inferior_ptid. */
remove_breakpoints (); remove_breakpoints ();
fork_load_infrun_state (oldfp); fork_load_infrun_state (oldfp);
insert_breakpoints (); insert_breakpoints ();
} }
}
static int static int
inferior_call_waitpid (ptid_t pptid, int pid) inferior_call_waitpid (ptid_t pptid, int pid)
{ {
struct objfile *waitpid_objf; struct objfile *waitpid_objf;
struct value *waitpid_fn = NULL; struct value *waitpid_fn = NULL;
struct value *argv[4]; struct value *argv[4], *retv;
struct gdbarch *gdbarch = get_current_arch (); struct gdbarch *gdbarch = get_current_arch ();
struct fork_info *oldfp = NULL, *newfp = NULL; struct fork_info *oldfp = NULL, *newfp = NULL;
struct cleanup *old_cleanup = NULL; struct cleanup *old_cleanup;
int ret = -1; int ret = -1;
if (!ptid_equal (pptid, inferior_ptid)) if (!ptid_equal (pptid, inferior_ptid))
@ -445,9 +448,9 @@ inferior_call_waitpid (ptid_t pptid, int pid)
remove_breakpoints (); remove_breakpoints ();
fork_load_infrun_state (newfp); fork_load_infrun_state (newfp);
insert_breakpoints (); insert_breakpoints ();
}
old_cleanup = make_cleanup (inferior_call_waitpid_cleanup, oldfp); old_cleanup = make_cleanup (inferior_call_waitpid_cleanup, oldfp);
}
/* Get the waitpid_fn. */ /* Get the waitpid_fn. */
if (lookup_minimal_symbol ("waitpid", NULL, NULL) != NULL) if (lookup_minimal_symbol ("waitpid", NULL, NULL) != NULL)
@ -463,12 +466,13 @@ inferior_call_waitpid (ptid_t pptid, int pid)
argv[2] = value_from_longest (builtin_type (gdbarch)->builtin_int, 0); argv[2] = value_from_longest (builtin_type (gdbarch)->builtin_int, 0);
argv[3] = 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; ret = 0;
out: out:
if (old_cleanup)
do_cleanups (old_cleanup); do_cleanups (old_cleanup);
return ret; return ret;
} }
@ -478,7 +482,7 @@ out:
static void static void
delete_checkpoint_command (char *args, int from_tty) delete_checkpoint_command (char *args, int from_tty)
{ {
ptid_t ptid; ptid_t ptid, pptid;
struct fork_info *fi; struct fork_info *fi;
if (!args || !*args) if (!args || !*args)
@ -497,6 +501,7 @@ Please switch to another checkpoint before deleting the current one"));
fi = find_fork_ptid (ptid); fi = find_fork_ptid (ptid);
gdb_assert (fi); gdb_assert (fi);
pptid = fi->parent_ptid;
if (from_tty) if (from_tty)
printf_filtered (_("Killed %s\n"), target_pid_to_str (ptid)); 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. list, waitpid the ptid.
If fi->parent_ptid is a part of lwp and it is stoped, waitpid the If fi->parent_ptid is a part of lwp and it is stoped, waitpid the
ptid. */ ptid. */
if ((!find_thread_ptid (fi->parent_ptid) && find_fork_ptid (fi->parent_ptid)) if ((!find_thread_ptid (pptid) && find_fork_ptid (pptid))
|| (find_thread_ptid (fi->parent_ptid) && is_stopped (fi->parent_ptid))) || (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)); warning (_("Unable to wait pid %s"), target_pid_to_str (ptid));
} }
} }