From: Ben Dunbobbin Date: Fri, 22 Dec 2017 18:32:15 +0000 (+0000) Subject: [ThinLTO][CachePruning] explicitly disable pruning X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=463ba76180cc06c5f2c0f1cfc97913ef48314456;p=llvm [ThinLTO][CachePruning] explicitly disable pruning In https://reviews.llvm.org/rL321077 and https://reviews.llvm.org/D41231 I fixed a regression in the c-api which prevented the pruning from being *effectively* disabled. However this approach, helpfully recommended by @labath, is cleaner. It is also nice to remove the weasel words about effectively disabling from the api comments. Differential Revision: https://reviews.llvm.org/D41497 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@321376 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm-c/lto.h b/include/llvm-c/lto.h index 0fc02f46f7a..55f3e46c45e 100644 --- a/include/llvm-c/lto.h +++ b/include/llvm-c/lto.h @@ -764,7 +764,7 @@ extern void thinlto_codegen_add_cross_referenced_symbol(thinlto_code_gen_t cg, * To avoid filling the disk space, a few knobs are provided: * - The pruning interval limits the frequency at which the garbage collector * will try to scan the cache directory to prune expired entries. - * Setting to a negative number applies the maximum interval. + * Setting to a negative number disables the pruning. * - The pruning expiration time indicates to the garbage collector how old an * entry needs to be to be removed. * - Finally, the garbage collector can be instructed to prune the cache until @@ -782,9 +782,9 @@ extern void thinlto_codegen_set_cache_dir(thinlto_code_gen_t cg, const char *cache_dir); /** - * Sets the cache pruning interval (in seconds). A negative value sets the - * maximum possible pruning interval. An unspecified default value will be - * applied, and a value of 0 will be ignored. + * Sets the cache pruning interval (in seconds). A negative value disables the + * pruning. An unspecified default value will be applied, and a value of 0 will + * be ignored. * * \since LTO_API_VERSION=18 */ diff --git a/include/llvm/LTO/legacy/ThinLTOCodeGenerator.h b/include/llvm/LTO/legacy/ThinLTOCodeGenerator.h index b879c7882ee..d794535700e 100644 --- a/include/llvm/LTO/legacy/ThinLTOCodeGenerator.h +++ b/include/llvm/LTO/legacy/ThinLTOCodeGenerator.h @@ -148,16 +148,15 @@ public: /// incremental build. void setCacheDir(std::string Path) { CacheOptions.Path = std::move(Path); } - /// Cache policy: interval (seconds) between two prunes of the cache. A - /// negative value sets the maximum possible pruning interval. A value - /// of 0 will be ignored. + /// Cache policy: interval (seconds) between two prunes of the cache. Set to a + /// negative value to disable pruning. A value of 0 will be ignored. void setCachePruningInterval(int Interval) { - static_assert(std::is_same::value, - "ensure same types to avoid risk of overflow"); - if (Interval) - CacheOptions.Policy.Interval = Interval > 0 ? std::chrono::seconds(Interval) - : std::chrono::seconds::max(); + if (Interval == 0) + return; + if(Interval < 0) + CacheOptions.Policy.Interval.reset(); + else + CacheOptions.Policy.Interval = std::chrono::seconds(Interval); } /// Cache policy: expiration (in seconds) for an entry. diff --git a/include/llvm/Support/CachePruning.h b/include/llvm/Support/CachePruning.h index c577e9b8b63..327c7df4570 100644 --- a/include/llvm/Support/CachePruning.h +++ b/include/llvm/Support/CachePruning.h @@ -27,8 +27,9 @@ template class Expected; struct CachePruningPolicy { /// The pruning interval. This is intended to be used to avoid scanning the /// directory too often. It does not impact the decision of which file to - /// prune. A value of 0 forces the scan to occur. - std::chrono::seconds Interval = std::chrono::seconds(1200); + /// prune. A value of 0 forces the scan to occur. A value of None disables + /// pruning. + llvm::Optional Interval = std::chrono::seconds(1200); /// The expiration for a file. When a file hasn't been accessed for Expiration /// seconds, it is removed from the cache. A value of 0 disables the diff --git a/lib/Support/CachePruning.cpp b/lib/Support/CachePruning.cpp index e1ad8024096..141573c2a1c 100644 --- a/lib/Support/CachePruning.cpp +++ b/lib/Support/CachePruning.cpp @@ -155,8 +155,7 @@ bool llvm::pruneCache(StringRef Path, CachePruningPolicy Policy) { SmallString<128> TimestampFile(Path); sys::path::append(TimestampFile, "llvmcache.timestamp"); sys::fs::file_status FileStatus; - const auto CurrentTime = - time_point_cast(system_clock::now()); + const auto CurrentTime = system_clock::now(); if (auto EC = sys::fs::status(TimestampFile, FileStatus)) { if (EC == errc::no_such_file_or_directory) { // If the timestamp file wasn't there, create one now. @@ -166,13 +165,14 @@ bool llvm::pruneCache(StringRef Path, CachePruningPolicy Policy) { return false; } } else { + if (!Policy.Interval) + return false; if (Policy.Interval != seconds(0)) { // Check whether the time stamp is older than our pruning interval. // If not, do nothing. - const auto TimeStampModTime = time_point_cast( - FileStatus.getLastModificationTime()); + const auto TimeStampModTime = FileStatus.getLastModificationTime(); auto TimeStampAge = CurrentTime - TimeStampModTime; - if (TimeStampAge <= Policy.Interval) { + if (TimeStampAge <= *Policy.Interval) { DEBUG(dbgs() << "Timestamp file too recent (" << duration_cast(TimeStampAge).count() << "s old), do not prune.\n");