* 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-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.
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.
}
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. */
#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;
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;
/* 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.
#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;
#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;
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 ();
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);
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);
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.
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)
{
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;
/* 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.
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);
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);
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