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:
parent
1a24cf0e5b
commit
e17c9e56cb
2 changed files with 28 additions and 15 deletions
|
@ -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.
|
||||||
|
|
|
@ -417,10 +417,13 @@ 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
|
||||||
|
@ -428,10 +431,10 @@ 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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue