* inf-child.c (inf_child_follow_fork): Add OPS argument.

* inf-ptrace.c (inf_ptrace_follow_fork): Likewise.
	* inf-ttrace.c (inf_ttrace_follow_fork): Likewise.
	* inftarg.c (child_follow_fork): Likewise.
	* linux-nat.c (child_follow_fork): Likewise.  Use ops instead of
	&deprecated_child_ops.
	* target.c (update_current_target): Do not inherit to_follow_fork.
	(target_follow_fork): New function.
	(debug_to_follow_fork): Remove.
	(setup_target_debug): Don't set to_follow_fork.
	* target.h (struct target_ops): Add struct target_ops * to
	to_follow_fork.
	(child_follow_fork): Add struct target_ops * argument.
	(target_follow_fork): Replace macro with prototype.
This commit is contained in:
Daniel Jacobowitz 2005-09-04 16:18:20 +00:00
parent 7c04e18903
commit ee05721234
8 changed files with 58 additions and 29 deletions

View File

@ -1,3 +1,20 @@
2005-09-04 Daniel Jacobowitz <dan@debian.org>
* inf-child.c (inf_child_follow_fork): Add OPS argument.
* inf-ptrace.c (inf_ptrace_follow_fork): Likewise.
* inf-ttrace.c (inf_ttrace_follow_fork): Likewise.
* inftarg.c (child_follow_fork): Likewise.
* linux-nat.c (child_follow_fork): Likewise. Use ops instead of
&deprecated_child_ops.
* target.c (update_current_target): Do not inherit to_follow_fork.
(target_follow_fork): New function.
(debug_to_follow_fork): Remove.
(setup_target_debug): Don't set to_follow_fork.
* target.h (struct target_ops): Add struct target_ops * to
to_follow_fork.
(child_follow_fork): Add struct target_ops * argument.
(target_follow_fork): Replace macro with prototype.
2005-09-02 Kevin Buettner <kevinb@redhat.com>
* mn10300-tdep.c (mn10300_dwarf2_reg_to_regnum): Use ARRAY_SIZE.

View File

@ -2,7 +2,7 @@
Unix.
Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
1998, 1999, 2000, 2001, 2002, 2004 Free Software Foundation, Inc.
1998, 1999, 2000, 2001, 2002, 2004, 2005 Free Software Foundation, Inc.
This file is part of GDB.
@ -121,7 +121,7 @@ inf_child_remove_vfork_catchpoint (int pid)
}
static int
inf_child_follow_fork (int follow_child)
inf_child_follow_fork (struct target_ops *ops, int follow_child)
{
/* This version of Unix doesn't support following fork or vfork
events. */

View File

@ -44,7 +44,7 @@ static struct target_ops *ptrace_ops_hack;
#ifdef PT_GET_PROCESS_STATE
static int
inf_ptrace_follow_fork (int follow_child)
inf_ptrace_follow_fork (struct target_ops *ops, int follow_child)
{
pid_t pid, fpid;
ptrace_state_t pe;

View File

@ -404,7 +404,7 @@ inf_ttrace_stopped_by_watchpoint (void)
static pid_t inf_ttrace_vfork_ppid = -1;
static int
inf_ttrace_follow_fork (int follow_child)
inf_ttrace_follow_fork (struct target_ops *ops, int follow_child)
{
pid_t pid, fpid;
lwpid_t lwpid, flwpid;

View File

@ -1,7 +1,7 @@
/* Target-vector operations for controlling Unix child processes, for GDB.
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999,
2000, 2002, 2003, 2004 Free Software Foundation, Inc.
2000, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
Contributed by Cygnus Support.
@ -401,7 +401,7 @@ child_remove_vfork_catchpoint (int pid)
#if !defined(CHILD_FOLLOW_FORK)
int
child_follow_fork (int follow_child)
child_follow_fork (struct target_ops *ops, int follow_child)
{
/* This version of Unix doesn't support following fork or vfork events. */
return 0;

View File

@ -334,7 +334,7 @@ child_post_startup_inferior (ptid_t ptid)
#endif
int
child_follow_fork (int follow_child)
child_follow_fork (struct target_ops *ops, int follow_child)
{
ptid_t last_ptid;
struct target_waitstatus last_status;
@ -466,7 +466,10 @@ child_follow_fork (int follow_child)
target_detach (NULL, 0);
inferior_ptid = pid_to_ptid (child_pid);
push_target (&deprecated_child_ops);
/* Reinstall ourselves, since we might have been removed in
target_detach (which does other necessary cleanup). */
push_target (ops);
/* Reset breakpoints in the child as appropriate. */
follow_inferior_reset_breakpoints ();

View File

@ -422,7 +422,7 @@ update_current_target (void)
INHERIT (to_remove_fork_catchpoint, t);
INHERIT (to_insert_vfork_catchpoint, t);
INHERIT (to_remove_vfork_catchpoint, t);
INHERIT (to_follow_fork, t);
/* Do not inherit to_follow_fork. */
INHERIT (to_insert_exec_catchpoint, t);
INHERIT (to_remove_exec_catchpoint, t);
INHERIT (to_reported_exec_events_per_exec_call, t);
@ -579,9 +579,6 @@ update_current_target (void)
de_fault (to_remove_vfork_catchpoint,
(int (*) (int))
tcomplain);
de_fault (to_follow_fork,
(int (*) (int))
target_ignore);
de_fault (to_insert_exec_catchpoint,
(void (*) (int))
tcomplain);
@ -1500,6 +1497,31 @@ target_async_mask (int mask)
return saved_async_masked_status;
}
/* Look through the list of possible targets for a target that can
follow forks. */
int
target_follow_fork (int follow_child)
{
struct target_ops *t;
for (t = current_target.beneath; t != NULL; t = t->beneath)
{
if (t->to_follow_fork != NULL)
{
int retval = t->to_follow_fork (t, follow_child);
if (targetdebug)
fprintf_unfiltered (gdb_stdlog, "target_follow_fork (%d) = %d\n",
follow_child, retval);
return retval;
}
}
/* Some target returned a fork event, but did not know how to follow it. */
internal_error (__FILE__, __LINE__,
"could not find a target to follow fork");
}
/* Look through the list of possible targets for a target that can
execute a run or attach command without any other data. This is
used to locate the default process stratum.
@ -2336,17 +2358,6 @@ debug_to_remove_vfork_catchpoint (int pid)
return retval;
}
static int
debug_to_follow_fork (int follow_child)
{
int retval = debug_target.to_follow_fork (follow_child);
fprintf_unfiltered (gdb_stdlog, "target_follow_fork (%d) = %d\n",
follow_child, retval);
return retval;
}
static void
debug_to_insert_exec_catchpoint (int pid)
{
@ -2539,7 +2550,6 @@ setup_target_debug (void)
current_target.to_remove_fork_catchpoint = debug_to_remove_fork_catchpoint;
current_target.to_insert_vfork_catchpoint = debug_to_insert_vfork_catchpoint;
current_target.to_remove_vfork_catchpoint = debug_to_remove_vfork_catchpoint;
current_target.to_follow_fork = debug_to_follow_fork;
current_target.to_insert_exec_catchpoint = debug_to_insert_exec_catchpoint;
current_target.to_remove_exec_catchpoint = debug_to_remove_exec_catchpoint;
current_target.to_reported_exec_events_per_exec_call = debug_to_reported_exec_events_per_exec_call;

View File

@ -1,7 +1,7 @@
/* Interface between GDB and target environments, including files and processes
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
Contributed by Cygnus Support. Written by John Gilmore.
@ -362,7 +362,7 @@ struct target_ops
int (*to_remove_fork_catchpoint) (int);
void (*to_insert_vfork_catchpoint) (int);
int (*to_remove_vfork_catchpoint) (int);
int (*to_follow_fork) (int);
int (*to_follow_fork) (struct target_ops *, int);
void (*to_insert_exec_catchpoint) (int);
int (*to_remove_exec_catchpoint) (int);
int (*to_reported_exec_events_per_exec_call) (void);
@ -582,7 +582,7 @@ extern int child_remove_vfork_catchpoint (int);
extern void child_acknowledge_created_inferior (int);
extern int child_follow_fork (int);
extern int child_follow_fork (struct target_ops *, int);
extern void child_insert_exec_catchpoint (int);
@ -747,8 +747,7 @@ extern void target_load (char *arg, int from_tty);
This function returns 1 if the inferior should not be resumed
(i.e. there is another event pending). */
#define target_follow_fork(follow_child) \
(*current_target.to_follow_fork) (follow_child)
int target_follow_fork (int follow_child);
/* On some targets, we can catch an inferior exec event when it
occurs. These functions insert/remove an already-created