aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog17
-rw-r--r--gdb/inf-child.c4
-rw-r--r--gdb/inf-ptrace.c2
-rw-r--r--gdb/inf-ttrace.c2
-rw-r--r--gdb/inftarg.c4
-rw-r--r--gdb/linux-nat.c7
-rw-r--r--gdb/target.c42
-rw-r--r--gdb/target.h9
8 files changed, 58 insertions, 29 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index c791019..764d8a9 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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.
diff --git a/gdb/inf-child.c b/gdb/inf-child.c
index 31bdd29..9633009 100644
--- a/gdb/inf-child.c
+++ b/gdb/inf-child.c
@@ -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. */
diff --git a/gdb/inf-ptrace.c b/gdb/inf-ptrace.c
index 78892aa..07ebb9d 100644
--- a/gdb/inf-ptrace.c
+++ b/gdb/inf-ptrace.c
@@ -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;
diff --git a/gdb/inf-ttrace.c b/gdb/inf-ttrace.c
index 4139355..a9087af 100644
--- a/gdb/inf-ttrace.c
+++ b/gdb/inf-ttrace.c
@@ -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;
diff --git a/gdb/inftarg.c b/gdb/inftarg.c
index 279f3a7..5d7750d 100644
--- a/gdb/inftarg.c
+++ b/gdb/inftarg.c
@@ -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;
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index 3c28219..582bcfb 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -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 ();
diff --git a/gdb/target.c b/gdb/target.c
index 83501e6..d842f50 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -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);
@@ -1501,6 +1498,31 @@ target_async_mask (int mask)
}
/* 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;
diff --git a/gdb/target.h b/gdb/target.h
index 582fa78..f1de230 100644
--- a/gdb/target.h
+++ b/gdb/target.h
@@ -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