aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/gc.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2005-01-27 15:21:29 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2005-01-27 15:21:29 +0000
commitc505702265833a762d681952bcc72562d64a242e (patch)
treeda6f095532755b766d7752d6925ea865ba0cefe2 /src/libstore/gc.cc
parent59682e618805701f9c249736514df6db457895f9 (diff)
* Fix and simplify the garbage collector (it's still not concurrent,
though). In particular it's now much easier to register a GC root. Just place a symlink to whatever store path it is that you want to keep in /nix/var/nix/gcroots.
Diffstat (limited to 'src/libstore/gc.cc')
-rw-r--r--src/libstore/gc.cc58
1 files changed, 57 insertions, 1 deletions
diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc
index 4f3306505..ba6e6bb9d 100644
--- a/src/libstore/gc.cc
+++ b/src/libstore/gc.cc
@@ -1,12 +1,68 @@
#include "globals.hh"
#include "gc.hh"
-
+#include "build.hh"
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
+void collectGarbage(const PathSet & roots, GCAction action,
+ PathSet & result)
+{
+ result.clear();
+
+ /* !!! TODO: Acquire an exclusive lock on the gcroots directory.
+ This prevents the set of live paths from increasing after this
+ point. */
+
+ /* Determine the live paths which is just the closure of the
+ roots under the `references' relation. */
+ PathSet livePaths;
+ for (PathSet::const_iterator i = roots.begin(); i != roots.end(); ++i)
+ computeFSClosure(canonPath(*i), livePaths);
+
+ if (action == gcReturnLive) {
+ result = livePaths;
+ return;
+ }
+
+ /* !!! TODO: Try to acquire (without blocking) exclusive locks on
+ the files in the `pending' directory. Delete all files for
+ which we managed to acquire such a lock (since if we could get
+ such a lock, that means that the process that owned the file
+ has died). */
+
+ /* !!! TODO: Acquire shared locks on all files in the pending
+ directories. This prevents the set of pending paths from
+ increasing while we are garbage-collecting. Read the set of
+ pending paths from those files. */
+
+ /* Read the Nix store directory to find all currently existing
+ paths. */
+ Strings storeNames = readDirectory(nixStore);
+
+ for (Strings::iterator i = storeNames.begin(); i != storeNames.end(); ++i) {
+ Path path = canonPath(nixStore + "/" + *i);
+
+ if (livePaths.find(path) != livePaths.end()) {
+ debug(format("live path `%1%'") % path);
+ continue;
+ }
+
+ debug(format("dead path `%1%'") % path);
+ result.insert(path);
+
+ if (action == gcDeleteDead) {
+ printMsg(lvlInfo, format("deleting `%1%'") % path);
+ deleteFromStore(path);
+ }
+
+ }
+}
+
+
+
#if 0
void followLivePaths(Path nePath, PathSet & live)
{