summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2014-11-19 17:09:27 +0100
committerLudovic Courtès <ludo@gnu.org>2015-05-11 17:41:56 +0200
commit4eb62b5230c29e2f6ab17352439521083846c259 (patch)
tree25931537d2d2797375e7a747129dcd1f7e0ef597
parentf160a30d5612506de41a8206a57eccee1cd85fb7 (diff)
downloadguix-4eb62b5230c29e2f6ab17352439521083846c259.tar.gz
nix-daemon: Call exit(), not _exit()
This was preventing destructors from running. In particular, it was
preventing the deletion of the temproot file for each worker
process. It may also have been responsible for the excessive WAL
growth on Hydra (due to the SQLite database not being closed
properly).

Apparently broken by accident in
8e9140cfdef9dbd1eb61e4c75c91d452ab5e4a74.
-rw-r--r--nix/libutil/util.cc8
-rw-r--r--nix/libutil/util.hh3
-rw-r--r--nix/nix-daemon/nix-daemon.cc4
3 files changed, 10 insertions, 5 deletions
diff --git a/nix/libutil/util.cc b/nix/libutil/util.cc
index ad3b3c387f..a4a1ddb12a 100644
--- a/nix/libutil/util.cc
+++ b/nix/libutil/util.cc
@@ -858,7 +858,8 @@ void killUser(uid_t uid)
 //////////////////////////////////////////////////////////////////////
 
 
-pid_t startProcess(std::function<void()> fun, const string & errorPrefix)
+pid_t startProcess(std::function<void()> fun,
+    bool dieWithParent, const string & errorPrefix, bool runExitHandlers)
 {
     pid_t pid = fork();
     if (pid == -1) throw SysError("unable to fork");
@@ -873,7 +874,10 @@ pid_t startProcess(std::function<void()> fun, const string & errorPrefix)
                 std::cerr << errorPrefix << e.what() << "\n";
             } catch (...) { }
         } catch (...) { }
-        _exit(1);
+        if (runExitHandlers)
+            exit(1);
+        else
+            _exit(1);
     }
 
     return pid;
diff --git a/nix/libutil/util.hh b/nix/libutil/util.hh
index 418d76daec..0ad0026711 100644
--- a/nix/libutil/util.hh
+++ b/nix/libutil/util.hh
@@ -269,7 +269,8 @@ void killUser(uid_t uid);
 
 /* Fork a process that runs the given function, and return the child
    pid to the caller. */
-pid_t startProcess(std::function<void()> fun, const string & errorPrefix = "error: ");
+pid_t startProcess(std::function<void()> fun, bool dieWithParent = true,
+    const string & errorPrefix = "error: ", bool runExitHandlers = false);
 
 
 /* Run a program and return its stdout in a string (i.e., like the
diff --git a/nix/nix-daemon/nix-daemon.cc b/nix/nix-daemon/nix-daemon.cc
index 2fa3632dfe..e42d602a3a 100644
--- a/nix/nix-daemon/nix-daemon.cc
+++ b/nix/nix-daemon/nix-daemon.cc
@@ -924,8 +924,8 @@ static void daemonLoop()
                 to.fd = remote;
                 processConnection(trusted);
 
-                _exit(0);
-            }, "unexpected Nix daemon error: ");
+                exit(0);
+            }, false, "unexpected Nix daemon error: ", true);
 
         } catch (Interrupted & e) {
             throw;