#pragma once #include "store-api.hh" namespace nix { typedef std::unordered_map> Roots; struct GCOptions { /* Garbage collector operation: - `gcReturnLive': return the set of paths reachable from (i.e. in the closure of) the roots. - `gcReturnDead': return the set of paths not reachable from the roots. - `gcDeleteDead': actually delete the latter set. - `gcDeleteSpecific': delete the paths listed in `pathsToDelete', insofar as they are not reachable. */ typedef enum { gcReturnLive, gcReturnDead, gcDeleteDead, gcDeleteSpecific, } GCAction; GCAction action{gcDeleteDead}; /* If `ignoreLiveness' is set, then reachability from the roots is ignored (dangerous!). However, the paths must still be unreferenced *within* the store (i.e., there can be no other store paths that depend on them). */ bool ignoreLiveness{false}; /* For `gcDeleteSpecific', the paths to delete. */ StorePathSet pathsToDelete; /* Stop after at least `maxFreed' bytes have been freed. */ uint64_t maxFreed{std::numeric_limits::max()}; }; struct GCResults { /* Depending on the action, the GC roots, or the paths that would be or have been deleted. */ PathSet paths; /* For `gcReturnDead', `gcDeleteDead' and `gcDeleteSpecific', the number of bytes that would be or was freed. */ uint64_t bytesFreed = 0; }; struct GcStore : public virtual Store { /* Add an indirect root, which is merely a symlink to `path' from /nix/var/nix/gcroots/auto/. `path' is supposed to be a symlink to a store path. The garbage collector will automatically remove the indirect root when it finds that `path' has disappeared. */ virtual void addIndirectRoot(const Path & path) = 0; /* Find the roots of the garbage collector. Each root is a pair (link, storepath) where `link' is the path of the symlink outside of the Nix store that point to `storePath'. If 'censor' is true, privacy-sensitive information about roots found in /proc is censored. */ virtual Roots findRoots(bool censor) = 0; /* Perform a garbage collection. */ virtual void collectGarbage(const GCOptions & options, GCResults & results) = 0; }; GcStore & requireGcStore(Store & store); }