* fork-child.c (fork_inferior): Fork instead of vfork if

PRE_TRACE_FUN is non-null.
This commit is contained in:
Mark Kettenis 2004-11-29 08:37:14 +00:00
parent 1d5cce3bc9
commit 3919e12ce5
2 changed files with 17 additions and 4 deletions

View file

@ -1,3 +1,8 @@
2004-11-29 Mark Kettenis <kettenis@gnu.org>
* fork-child.c (fork_inferior): Fork instead of vfork if
PRE_TRACE_FUN is non-null.
2004-11-24 Fred Fish <fnf@specifixinc.com> 2004-11-24 Fred Fish <fnf@specifixinc.com>
* rs6000-tdep.c (skip_prologue): Use line table info to skip over * rs6000-tdep.c (skip_prologue): Use line table info to skip over

View file

@ -274,10 +274,18 @@ fork_inferior (char *exec_file_arg, char *allargs, char **env,
if (pre_trace_fun != NULL) if (pre_trace_fun != NULL)
(*pre_trace_fun) (); (*pre_trace_fun) ();
/* Create the child process. Note that the apparent call to vfork() /* Create the child process. Since the child process is going to
below *might* actually be a call to fork() due to the fact that exec(3) shortlty afterwards, try to reduce the overhead by
autoconf will ``#define vfork fork'' on certain platforms. */ calling vfork(2). However, if PRE_TRACE_FUN is non-null, it's
if (debug_fork) 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 (); pid = fork ();
else else
pid = vfork (); pid = vfork ();