summaryrefslogtreecommitdiff
path: root/lib/Support/CachePruning.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Support/CachePruning.cpp')
-rw-r--r--lib/Support/CachePruning.cpp47
1 files changed, 35 insertions, 12 deletions
diff --git a/lib/Support/CachePruning.cpp b/lib/Support/CachePruning.cpp
index 7326c4fc91fb..a0aa6024b3ed 100644
--- a/lib/Support/CachePruning.cpp
+++ b/lib/Support/CachePruning.cpp
@@ -27,6 +27,28 @@
using namespace llvm;
+namespace {
+struct FileInfo {
+ sys::TimePoint<> Time;
+ uint64_t Size;
+ std::string Path;
+
+ /// Used to determine which files to prune first. Also used to determine
+ /// set membership, so must take into account all fields.
+ bool operator<(const FileInfo &Other) const {
+ if (Time < Other.Time)
+ return true;
+ else if (Other.Time < Time)
+ return false;
+ if (Other.Size < Size)
+ return true;
+ else if (Size < Other.Size)
+ return false;
+ return Path < Other.Path;
+ }
+};
+} // anonymous namespace
+
/// Write a new timestamp file with the given path. This is used for the pruning
/// interval option.
static void writeTimestampFile(StringRef TimestampFile) {
@@ -185,8 +207,9 @@ bool llvm::pruneCache(StringRef Path, CachePruningPolicy Policy) {
writeTimestampFile(TimestampFile);
}
- // Keep track of space. Needs to be kept ordered by size for determinism.
- std::set<std::pair<uint64_t, std::string>> FileSizes;
+ // Keep track of files to delete to get below the size limit.
+ // Order by time of last use so that recently used files are preserved.
+ std::set<FileInfo> FileInfos;
uint64_t TotalSize = 0;
// Walk the entire directory cache, looking for unused files.
@@ -224,22 +247,22 @@ bool llvm::pruneCache(StringRef Path, CachePruningPolicy Policy) {
// Leave it here for now, but add it to the list of size-based pruning.
TotalSize += StatusOrErr->getSize();
- FileSizes.insert({StatusOrErr->getSize(), std::string(File->path())});
+ FileInfos.insert({FileAccessTime, StatusOrErr->getSize(), File->path()});
}
- auto FileAndSize = FileSizes.rbegin();
- size_t NumFiles = FileSizes.size();
+ auto FileInfo = FileInfos.begin();
+ size_t NumFiles = FileInfos.size();
auto RemoveCacheFile = [&]() {
// Remove the file.
- sys::fs::remove(FileAndSize->second);
+ sys::fs::remove(FileInfo->Path);
// Update size
- TotalSize -= FileAndSize->first;
+ TotalSize -= FileInfo->Size;
NumFiles--;
- LLVM_DEBUG(dbgs() << " - Remove " << FileAndSize->second << " (size "
- << FileAndSize->first << "), new occupancy is "
- << TotalSize << "%\n");
- ++FileAndSize;
+ LLVM_DEBUG(dbgs() << " - Remove " << FileInfo->Path << " (size "
+ << FileInfo->Size << "), new occupancy is " << TotalSize
+ << "%\n");
+ ++FileInfo;
};
// Prune for number of files.
@@ -270,7 +293,7 @@ bool llvm::pruneCache(StringRef Path, CachePruningPolicy Policy) {
<< Policy.MaxSizeBytes << " bytes\n");
// Remove the oldest accessed files first, till we get below the threshold.
- while (TotalSize > TotalSizeTarget && FileAndSize != FileSizes.rend())
+ while (TotalSize > TotalSizeTarget && FileInfo != FileInfos.end())
RemoveCacheFile();
}
return true;