diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f5f05744a6..b7c605df3b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2004-11-29 Mark Kettenis + + * fork-child.c (fork_inferior): Fork instead of vfork if + PRE_TRACE_FUN is non-null. + 2004-11-24 Fred Fish * rs6000-tdep.c (skip_prologue): Use line table info to skip over diff --git a/gdb/fork-child.c b/gdb/fork-child.c index 90580baaa7..718a3d2de2 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 ();