This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[commit] Make to_follow_fork take a target argument
- From: Daniel Jacobowitz <drow at false dot org>
- To: gdb-patches at sourceware dot org
- Date: Sun, 4 Sep 2005 12:20:29 -0400
- Subject: [commit] Make to_follow_fork take a target argument
A cleanup I've had in my tree for quite a while, that I posted as part
of my original target inheritance patch.
The GNU/Linux to_follow_fork method calls push_target
(&deprecated_child_ops). This patch passes the correct target to
to_follow_fork, so that it can push the correct target instead. The
fact that I needed to use push_target here still bugs me; that can
probably be fixed. But this is the model we've been moving target
methods to anyway, so I don't feel that the patch is wasted even if I
eliminate the need later.
Tested on i686-pc-linux-gnu and committed.
--
Daniel Jacobowitz
CodeSourcery, LLC
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.
Index: inf-child.c
===================================================================
RCS file: /cvs/src/src/gdb/inf-child.c,v
retrieving revision 1.6
diff -u -p -r1.6 inf-child.c
--- inf-child.c 11 Feb 2005 04:05:54 -0000 1.6
+++ inf-child.c 4 Sep 2005 16:01:43 -0000
@@ -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 p
}
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. */
Index: inf-ptrace.c
===================================================================
RCS file: /cvs/src/src/gdb/inf-ptrace.c,v
retrieving revision 1.24
diff -u -p -r1.24 inf-ptrace.c
--- inf-ptrace.c 13 Aug 2005 22:23:35 -0000 1.24
+++ inf-ptrace.c 4 Sep 2005 16:01:43 -0000
@@ -44,7 +44,7 @@ static struct target_ops *ptrace_ops_hac
#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;
Index: inf-ttrace.c
===================================================================
RCS file: /cvs/src/src/gdb/inf-ttrace.c,v
retrieving revision 1.13
diff -u -p -r1.13 inf-ttrace.c
--- inf-ttrace.c 21 Jul 2005 10:36:19 -0000 1.13
+++ inf-ttrace.c 4 Sep 2005 16:01:43 -0000
@@ -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;
Index: inftarg.c
===================================================================
RCS file: /cvs/src/src/gdb/inftarg.c,v
retrieving revision 1.42
diff -u -p -r1.42 inftarg.c
--- inftarg.c 23 May 2005 19:32:27 -0000 1.42
+++ inftarg.c 4 Sep 2005 16:01:43 -0000
@@ -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;
Index: linux-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/linux-nat.c,v
retrieving revision 1.31
diff -u -p -r1.31 linux-nat.c
--- linux-nat.c 9 Aug 2005 16:35:45 -0000 1.31
+++ linux-nat.c 4 Sep 2005 16:01:44 -0000
@@ -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 ();
Index: target.c
===================================================================
RCS file: /cvs/src/src/gdb/target.c,v
retrieving revision 1.110
diff -u -p -r1.110 target.c
--- target.c 18 Jul 2005 21:00:49 -0000 1.110
+++ target.c 4 Sep 2005 16:01:44 -0000
@@ -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 pi
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;
Index: target.h
===================================================================
RCS file: /cvs/src/src/gdb/target.h,v
retrieving revision 1.75
diff -u -p -r1.75 target.h
--- target.h 26 May 2005 20:48:58 -0000 1.75
+++ target.h 4 Sep 2005 16:01:44 -0000
@@ -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
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
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