From ee057212343faef868b546ce17e9dfc3b370f8e0 Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Sun, 4 Sep 2005 16:18:20 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 17 +++++++++++++++++ gdb/inf-child.c | 4 ++-- gdb/inf-ptrace.c | 2 +- gdb/inf-ttrace.c | 2 +- gdb/inftarg.c | 4 ++-- gdb/linux-nat.c | 7 +++++-- gdb/target.c | 42 ++++++++++++++++++++++++++---------------- gdb/target.h | 9 ++++----- 8 files changed, 58 insertions(+), 29 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c791019c21..764d8a9ec5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,20 @@ +2005-09-04 Daniel Jacobowitz + + * 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 * mn10300-tdep.c (mn10300_dwarf2_reg_to_regnum): Use ARRAY_SIZE. diff --git a/gdb/inf-child.c b/gdb/inf-child.c index 31bdd29176..96330097e5 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 78892aa393..07ebb9d412 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 4139355057..a9087afa57 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 279f3a7da0..5d7750d65b 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 3c2821935e..582bcfb895 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 83501e6096..d842f5066b 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); @@ -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; diff --git a/gdb/target.h b/gdb/target.h index 582fa789a6..f1de230c46 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 -- 2.34.1