1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-07-06 21:41:48 +02:00

Use vfork() instead of fork() if available

Hopefully this reduces the chance of hitting ‘unable to fork: Cannot
allocate memory’ errors.  vfork() is used for everything except
starting builders.
This commit is contained in:
Eelco Dolstra 2012-11-09 18:00:33 +01:00
parent 48c19c4633
commit ea89df2b76
6 changed files with 51 additions and 22 deletions

View file

@ -665,7 +665,7 @@ HookInstance::HookInstance()
builderOut.create();
/* Fork the hook. */
pid = fork();
pid = maybeVfork();
switch (pid) {
case -1:
@ -2662,8 +2662,19 @@ void SubstitutionGoal::tryToRun()
if (pathExists(destPath))
deletePathWrapped(destPath);
worker.store.setSubstituterEnv();
/* Fill in the arguments. */
Strings args;
args.push_back(baseNameOf(sub));
args.push_back("--substitute");
args.push_back(storePath);
args.push_back(destPath);
const char * * argArr = strings2CharPtrs(args);
/* Fork the substitute program. */
pid = fork();
pid = maybeVfork();
switch (pid) {
case -1:
@ -2677,18 +2688,6 @@ void SubstitutionGoal::tryToRun()
if (dup2(outPipe.writeSide, STDOUT_FILENO) == -1)
throw SysError("cannot dup output pipe into stdout");
/* Pass configuration options (including those overriden
with --option) to the substituter. */
setenv("_NIX_OPTIONS", settings.pack().c_str(), 1);
/* Fill in the arguments. */
Strings args;
args.push_back(baseNameOf(sub));
args.push_back("--substitute");
args.push_back(storePath);
args.push_back(destPath);
const char * * argArr = strings2CharPtrs(args);
execv(sub.c_str(), (char * *) argArr);
throw SysError(format("executing `%1%'") % sub);