aboutsummaryrefslogtreecommitdiff
path: root/src/libstore
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2006-07-20 12:17:25 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2006-07-20 12:17:25 +0000
commitc15f544356dfebf6d08887e73fa156d4e70e2bbc (patch)
treefad9d05cb72330af8e96538e160d896b54fd0ca0 /src/libstore
parentebcccbd3581d34d7fefb975c0255a39a3e39e122 (diff)
* Call find-runtime-roots.pl from the garbage collector to prevent
running applications etc. from being garbage collected.
Diffstat (limited to 'src/libstore')
-rw-r--r--src/libstore/build.cc21
-rw-r--r--src/libstore/gc.cc31
2 files changed, 36 insertions, 16 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index 99828a55d..c80b3dfe9 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -12,10 +12,6 @@
#include <unistd.h>
#include <errno.h>
-#ifdef __CYGWIN__
-#include <windows.h>
-#endif
-
#include <pwd.h>
#include <grp.h>
@@ -321,13 +317,6 @@ const char * * strings2CharPtrs(const Strings & ss)
}
-/* Hack for Cygwin: _exit() doesn't seem to work quite right, since
- some Berkeley DB code appears to be called when a child exits
- through _exit() (e.g., because execve() failed). So call the
- Windows API directly. */
-#ifdef __CYGWIN__
-#define _exit(n) ExitProcess(n)
-#endif
//////////////////////////////////////////////////////////////////////
@@ -460,9 +449,9 @@ static void killUser(uid_t uid)
} catch (exception & e) {
cerr << format("build error: %1%\n") % e.what();
- _exit(1);
+ quickExit(1);
}
- _exit(0);
+ quickExit(0);
}
/* parent */
@@ -944,7 +933,7 @@ DerivationGoal::HookReply DerivationGoal::tryBuildHook()
} catch (exception & e) {
cerr << format("build error: %1%\n") % e.what();
}
- _exit(1);
+ quickExit(1);
}
/* parent */
@@ -1340,7 +1329,7 @@ void DerivationGoal::startBuilder()
} catch (exception & e) {
cerr << format("build error: %1%\n") % e.what();
}
- _exit(1);
+ quickExit(1);
}
@@ -1779,7 +1768,7 @@ void SubstitutionGoal::tryToRun()
} catch (exception & e) {
cerr << format("substitute error: %1%\n") % e.what();
}
- _exit(1);
+ quickExit(1);
}
/* parent */
diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc
index 484a5f2be..3831de440 100644
--- a/src/libstore/gc.cc
+++ b/src/libstore/gc.cc
@@ -316,6 +316,31 @@ static void findRoots(const Path & path, bool recurseSymlinks,
}
+static void addAdditionalRoots(PathSet & roots)
+{
+ Path rootFinder = getEnv("NIX_ROOT_FINDER",
+ "/nix/libexec/nix/find-runtime-roots.pl"); /* !!! */
+
+ if (rootFinder.empty()) return;
+
+ printMsg(lvlDebug, format("executing `%1%' to find additional roots") % rootFinder);
+
+ string result = runProgram(rootFinder);
+
+ Strings paths = tokenizeString(result, "\n");
+
+ for (Strings::iterator i = paths.begin(); i != paths.end(); ++i) {
+ if (isInStore(*i)) {
+ Path path = toStorePath(*i);
+ if (roots.find(path) == roots.end()) {
+ debug(format("found additional root `%1%'") % path);
+ roots.insert(path);
+ }
+ }
+ }
+}
+
+
static void dfsVisit(const PathSet & paths, const Path & path,
PathSet & visited, Paths & sorted)
{
@@ -370,6 +395,12 @@ void collectGarbage(GCAction action, const PathSet & pathsToDelete,
if (!ignoreLiveness)
findRoots(rootsDir, true, roots);
+ /* Add additional roots returned by the program specified by the
+ NIX_ROOT_FINDER environment variable. This is typically used
+ to add running programs to the set of roots (to prevent them
+ from being garbage collected). */
+ addAdditionalRoots(roots);
+
if (action == gcReturnRoots) {
result = roots;
return;