about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2012-11-15T18·35+0100
committerEelco Dolstra <eelco.dolstra@logicblox.com>2012-11-15T18·35+0100
commitf794465ca8bd2a8d41ee3b6928db5fb1479dc96d (patch)
tree972ed5f7b7327444556b0cdd2c92697a44575673
parent8541d27fce95f1f6a4a6c89bcbc09503ff7ea092 (diff)
Disable use of vfork()
vfork() is just too weird.  For instance, in this build:

  http://hydra.nixos.org/build/3330487

the value fromHook.writeSide becomes corrupted in the parent, even
though the child only reads from it.  At -O0 the problem goes away.
Probably the child is overriding some spilled temporary variable.

If I get bored I may implement using posix_spawn() instead.
-rw-r--r--configure.ac2
-rw-r--r--src/libstore/build.cc2
2 files changed, 2 insertions, 2 deletions
diff --git a/configure.ac b/configure.ac
index 0eb7d7632596..5816d75e50ef 100644
--- a/configure.ac
+++ b/configure.ac
@@ -116,7 +116,7 @@ AC_CHECK_HEADERS([sys/mount.h], [], [],
 
 
 # Check for vfork.
-AC_FUNC_FORK()
+#AC_FUNC_FORK()
 
 
 # Check for lutimes, optionally used for changing the mtime of
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index 2fd071ebad92..9e0db9ee7f0a 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -355,7 +355,7 @@ void Goal::trace(const format & f)
 
 
 /* Common initialisation performed in child processes. */
-void commonChildInit(Pipe & logPipe)
+static void commonChildInit(Pipe & logPipe)
 {
     /* Put the child in a separate session (and thus a separate
        process group) so that it has no controlling terminal (meaning