summaryrefslogtreecommitdiff
path: root/gdb/fork-child.c
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@gnu.org>2004-11-29 08:37:14 +0000
committerMark Kettenis <kettenis@gnu.org>2004-11-29 08:37:14 +0000
commit7a1e18c798c5ca0aefc00f2c658490cdc0f62061 (patch)
tree083a1e8f2e935c9355512f9cea01f5bafc137f05 /gdb/fork-child.c
parentcb3cdca91b63ace96e44f1963e82961aaf2b3ff9 (diff)
downloadgdb-7a1e18c798c5ca0aefc00f2c658490cdc0f62061.tar.gz
* fork-child.c (fork_inferior): Fork instead of vfork if
PRE_TRACE_FUN is non-null.
Diffstat (limited to 'gdb/fork-child.c')
-rw-r--r--gdb/fork-child.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/gdb/fork-child.c b/gdb/fork-child.c
index 90580baaa76..718a3d2de21 100644
--- a/gdb/fork-child.c
+++ b/gdb/fork-child.c
@@ -274,10 +274,18 @@ fork_inferior (char *exec_file_arg, char *allargs, char **env,
if (pre_trace_fun != NULL)
(*pre_trace_fun) ();
- /* Create the child process. Note that the apparent call to vfork()
- below *might* actually be a call to fork() due to the fact that
- autoconf will ``#define vfork fork'' on certain platforms. */
- if (debug_fork)
+ /* Create the child process. Since the child process is going to
+ exec(3) shortlty afterwards, try to reduce the overhead by
+ calling vfork(2). However, if PRE_TRACE_FUN is non-null, it's
+ likely that this optimization won't work since there's too much
+ work to do between the vfork(2) and the exec(3). This is known
+ to be the case on ttrace(2)-based HP-UX, where some handshaking
+ between parent and child needs to happen between fork(2) and
+ exec(2). However, since the parent is suspended in the vforked
+ state, this doesn't work. Also note that the vfork(2) call might
+ actually be a call to fork(2) due to the fact that autoconf will
+ ``#define vfork fork'' on certain platforms. */
+ if (pre_trace_fun || debug_fork)
pid = fork ();
else
pid = vfork ();