From 07107ca6f983e2dde5fa669a56563760a1f44c11 Mon Sep 17 00:00:00 2001 From: Luis Machado Date: Tue, 3 Sep 2013 17:22:45 +0000 Subject: [PATCH] * inf-child.c (inf_child_follow_fork) New parameter detach_fork. * inf-ptrace.c (inf_ptrace_follow_fork): Likewise. * inf-ttrace.c (inf_ttrace_follow_fork): Likewise. * inferior.h (detach_fork): Remove. * infrun.c (detach_fork): Adjust comment and make it static. (follow_fork): Pass detach_fork parameter to target_follow_fork. * linux-nat.c (linux_child_follow_fork): New parameter detach_fork. * target.c (target_follow_fork): New parameter detach_fork. Pass detach_fork as parameter and print its value. * target.h (struct target_ops) : New int parameter. (target_follow_fork): New parameter detach_fork. --- gdb/ChangeLog | 19 +++++++++++++++++++ gdb/inf-child.c | 3 ++- gdb/inf-ptrace.c | 3 ++- gdb/inf-ttrace.c | 3 ++- gdb/inferior.h | 5 ----- gdb/infrun.c | 10 +++++++--- gdb/linux-nat.c | 3 ++- gdb/target.c | 9 +++++---- gdb/target.h | 4 ++-- 9 files changed, 41 insertions(+), 18 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 06696d8e92f..caecc8d40ac 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,22 @@ +2013-09-03 Luis Machado + + * inf-child.c (inf_child_follow_fork) New parameter + detach_fork. + * inf-ptrace.c (inf_ptrace_follow_fork): Likewise. + * inf-ttrace.c (inf_ttrace_follow_fork): Likewise. + * inferior.h (detach_fork): Remove. + * infrun.c (detach_fork): Adjust comment and make it + static. + (follow_fork): Pass detach_fork parameter to + target_follow_fork. + * linux-nat.c (linux_child_follow_fork): New parameter + detach_fork. + * target.c (target_follow_fork): New parameter detach_fork. + Pass detach_fork as parameter and print its value. + * target.h (struct target_ops) : New int + parameter. + (target_follow_fork): New parameter detach_fork. + 2013-09-03 Joel Brobecker * solib-ia64-hpux.c (ia64_hpux_relocate_section_addresses): diff --git a/gdb/inf-child.c b/gdb/inf-child.c index f5992bb1f16..1878272bc0f 100644 --- a/gdb/inf-child.c +++ b/gdb/inf-child.c @@ -118,7 +118,8 @@ inf_child_post_startup_inferior (ptid_t ptid) } static int -inf_child_follow_fork (struct target_ops *ops, int follow_child) +inf_child_follow_fork (struct target_ops *ops, int follow_child, + int detach_fork) { /* 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 046e0ce9668..9e6e98058b8 100644 --- a/gdb/inf-ptrace.c +++ b/gdb/inf-ptrace.c @@ -40,7 +40,8 @@ #ifdef PT_GET_PROCESS_STATE static int -inf_ptrace_follow_fork (struct target_ops *ops, int follow_child) +inf_ptrace_follow_fork (struct target_ops *ops, int follow_child, + int detach_fork) { pid_t pid, fpid; ptrace_state_t pe; diff --git a/gdb/inf-ttrace.c b/gdb/inf-ttrace.c index 511a67cbcbc..3ba830fa669 100644 --- a/gdb/inf-ttrace.c +++ b/gdb/inf-ttrace.c @@ -409,7 +409,8 @@ inf_ttrace_stopped_by_watchpoint (void) static pid_t inf_ttrace_vfork_ppid = -1; static int -inf_ttrace_follow_fork (struct target_ops *ops, int follow_child) +inf_ttrace_follow_fork (struct target_ops *ops, int follow_child, + int detach_fork) { pid_t pid, fpid; lwpid_t lwpid, flwpid; diff --git a/gdb/inferior.h b/gdb/inferior.h index 2a5770dd358..1b83e52d965 100644 --- a/gdb/inferior.h +++ b/gdb/inferior.h @@ -119,11 +119,6 @@ extern int step_stop_if_no_debug; are kept running freely. */ extern int non_stop; -/* If set (default), when following a fork, GDB will detach from one - the fork branches, child or parent. Exactly which branch is - detached depends on 'set follow-fork-mode' setting. */ -extern int detach_fork; - /* When set (default), the target should attempt to disable the operating system's address space randomization feature when starting an inferior. */ extern int disable_randomization; diff --git a/gdb/infrun.c b/gdb/infrun.c index dc1036d7611..57618ae981f 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -132,8 +132,12 @@ int sync_execution = 0; static ptid_t previous_inferior_ptid; -/* Default behavior is to detach newly forked processes (legacy). */ -int detach_fork = 1; +/* If set (default for legacy reasons), when following a fork, GDB + will detach from one of the fork branches, child or parent. + Exactly which branch is detached depends on 'set follow-fork-mode' + setting. */ + +static int detach_fork = 1; int debug_displaced = 0; static void @@ -497,7 +501,7 @@ follow_fork (void) /* Tell the target to do whatever is necessary to follow either parent or child. */ - if (target_follow_fork (follow_child)) + if (target_follow_fork (follow_child, detach_fork)) { /* Target refused to follow, or there's some other reason we shouldn't resume. */ diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 46e3dbfec4c..90638e20dfe 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -376,7 +376,8 @@ delete_lwp_cleanup (void *lp_voidp) } static int -linux_child_follow_fork (struct target_ops *ops, int follow_child) +linux_child_follow_fork (struct target_ops *ops, int follow_child, + int detach_fork) { int has_vforked; int parent_pid, child_pid; diff --git a/gdb/target.c b/gdb/target.c index 3659bb90e4f..d55712d4c1c 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -2811,7 +2811,7 @@ target_program_signals (int numsigs, unsigned char *program_signals) follow forks. */ int -target_follow_fork (int follow_child) +target_follow_fork (int follow_child, int detach_fork) { struct target_ops *t; @@ -2819,11 +2819,12 @@ target_follow_fork (int follow_child) { if (t->to_follow_fork != NULL) { - int retval = t->to_follow_fork (t, follow_child); + int retval = t->to_follow_fork (t, follow_child, detach_fork); if (targetdebug) - fprintf_unfiltered (gdb_stdlog, "target_follow_fork (%d) = %d\n", - follow_child, retval); + fprintf_unfiltered (gdb_stdlog, + "target_follow_fork (%d, %d) = %d\n", + follow_child, detach_fork, retval); return retval; } } diff --git a/gdb/target.h b/gdb/target.h index 69595032658..76224655546 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -440,7 +440,7 @@ struct target_ops int (*to_remove_fork_catchpoint) (int); int (*to_insert_vfork_catchpoint) (int); int (*to_remove_vfork_catchpoint) (int); - int (*to_follow_fork) (struct target_ops *, int); + int (*to_follow_fork) (struct target_ops *, int, int); int (*to_insert_exec_catchpoint) (int); int (*to_remove_exec_catchpoint) (int); int (*to_set_syscall_catchpoint) (int, int, int, int, int *); @@ -1235,7 +1235,7 @@ void target_create_inferior (char *exec_file, char *args, This function returns 1 if the inferior should not be resumed (i.e. there is another event pending). */ -int target_follow_fork (int follow_child); +int target_follow_fork (int follow_child, int detach_fork); /* On some targets, we can catch an inferior exec event when it occurs. These functions insert/remove an already-created -- 2.30.2