mirror of
https://github.com/NixOS/nix
synced 2025-07-01 00:07:58 +02:00
* Call find-runtime-roots.pl from the garbage collector to prevent
running applications etc. from being garbage collected.
This commit is contained in:
parent
ebcccbd358
commit
c15f544356
6 changed files with 138 additions and 16 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue