diff options
-rw-r--r-- | src/libmain/shared.cc | 14 | ||||
-rw-r--r-- | src/libstore/gc.cc | 12 | ||||
-rw-r--r-- | src/libstore/gc.hh | 5 |
3 files changed, 30 insertions, 1 deletions
diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc index 395d9c8b4cd6..23fcf28916be 100644 --- a/src/libmain/shared.cc +++ b/src/libmain/shared.cc @@ -13,6 +13,7 @@ extern "C" { } #include "globals.hh" +#include "gc.hh" #include "shared.hh" #include "config.h" @@ -55,6 +56,15 @@ void checkStoreNotSymlink(Path path) } +struct RemoveTempRoots +{ + ~RemoveTempRoots() + { + removeTempRoots(); + } +}; + + void initDerivationsHelpers(); @@ -171,6 +181,10 @@ static void initAndRun(int argc, char * * argv) else remaining.push_back(arg); } + /* Automatically clean up the temporary roots file when we + exit. */ + RemoveTempRoots removeTempRoots; + run(remaining); } diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index 222a1ff95cc2..af40e0b9286a 100644 --- a/src/libstore/gc.cc +++ b/src/libstore/gc.cc @@ -63,6 +63,15 @@ void addTempRoot(const Path & path) } +void removeTempRoots() +{ + if (fdTempRoots != -1) { + fdTempRoots.close(); + unlink(fnTempRoots.c_str()); + } +} + + typedef shared_ptr<AutoCloseFD> FDPtr; typedef list<FDPtr> FDs; @@ -94,7 +103,8 @@ static void readTempRoots(PathSet & tempRoots, FDs & fds) if (lockFile(*fd, ltWrite, false)) { printMsg(lvlError, format("removing stale temporary roots file `%1%'") % path); - /* !!! write token, unlink */ + unlink(path.c_str()); + writeFull(*fd, (const unsigned char *) "d", 1); continue; } diff --git a/src/libstore/gc.hh b/src/libstore/gc.hh index c8f908b152aa..91c5be91406b 100644 --- a/src/libstore/gc.hh +++ b/src/libstore/gc.hh @@ -21,5 +21,10 @@ void collectGarbage(const PathSet & roots, GCAction action, deadlock. */ void addTempRoot(const Path & path); +/* Remove the temporary roots file for this process. Any temporary + root becomes garbage after this point unless it has been registered + as a (permanent) root. */ +void removeTempRoots(); + #endif /* !__GC_H */ |