This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Internalize detach_fork variable


Hi,

While doing the fork following work, i noticed detach_fork (the variable used to store the detach_on_fork setting) is being used as an external variable, which seems not ideal.

Since this variable is specific to forking, it makes more sense to pass it as parameter to the follow_fork hook.

This patch accomplishes exactly that by adding a new parameter to the follow_fork hook and replacing the use of the external global with a local parameter.

We also have sched_multi being used in the same way, but that one does not seem to be specific to forking. I'll leave that alone for now (but it could be internalized as well).

Ok?
2013-09-03  Luis Machado  <lgustavo@codesourcery.com>

	* 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) <to_follow_fork>: New int
	parameter.
	(target_follow_fork): New parameter detach_fork.

diff --git a/gdb/inf-child.c b/gdb/inf-child.c
index f5992bb..1878272 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 046e0ce..9e6e980 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 511a67c..3ba830f 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 2a5770d..1b83e52 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 dc1036d..57618ae 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 46e3dbf..90638e2 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 3659bb9..d55712d 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 6959503..7622465 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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]