12#include "llvm/Support/AdvisoryLock.h"
13#include "llvm/Support/Chrono.h"
21class ReaderWriterLock :
public llvm::AdvisoryLock {
23 std::unique_lock<std::shared_mutex> OwningLock;
26 ReaderWriterLock(std::shared_mutex &Mutex)
27 : OwningLock(Mutex, std::defer_lock) {}
29 Expected<bool> tryLock()
override {
return OwningLock.try_lock(); }
31 llvm::WaitForUnlockResult
32 waitForUnlockFor(std::chrono::seconds MaxSeconds)
override {
38 std::shared_lock<std::shared_mutex> Lock(*OwningLock.mutex());
39 return llvm::WaitForUnlockResult::Success;
42 std::error_code unsafeMaybeUnlock()
override {
49 ~ReaderWriterLock()
override =
default;
53 ModuleCacheEntries &Entries;
59 InMemoryModuleCache InMemory;
62 InProcessModuleCache(ModuleCacheEntries &Entries) : Entries(Entries) {}
64 void prepareForGetLock(StringRef Filename)
override {}
66 std::unique_ptr<llvm::AdvisoryLock> getLock(StringRef Filename)
override {
67 auto &CompilationMutex = [&]() -> std::shared_mutex & {
68 std::lock_guard<std::mutex> Lock(Entries.Mutex);
69 auto &Entry = Entries.Map[Filename];
71 Entry = std::make_unique<ModuleCacheEntry>();
72 return Entry->CompilationMutex;
74 return std::make_unique<ReaderWriterLock>(CompilationMutex);
77 std::time_t getModuleTimestamp(StringRef Filename)
override {
78 auto &Timestamp = [&]() -> std::atomic<std::time_t> & {
79 std::lock_guard<std::mutex> Lock(Entries.Mutex);
80 auto &Entry = Entries.Map[Filename];
82 Entry = std::make_unique<ModuleCacheEntry>();
83 return Entry->Timestamp;
86 return Timestamp.load();
89 void updateModuleTimestamp(StringRef Filename)
override {
91 auto &Timestamp = [&]() -> std::atomic<std::time_t> & {
92 std::lock_guard<std::mutex> Lock(Entries.Mutex);
93 auto &Entry = Entries.Map[Filename];
95 Entry = std::make_unique<ModuleCacheEntry>();
96 return Entry->Timestamp;
99 Timestamp.store(llvm::sys::toTimeT(std::chrono::system_clock::now()));
102 void maybePrune(StringRef Path, time_t PruneInterval,
103 time_t PruneAfter)
override {
109 InMemoryModuleCache &getInMemoryModuleCache()
override {
return InMemory; }
110 const InMemoryModuleCache &getInMemoryModuleCache()
const override {
118 return llvm::makeIntrusiveRefCnt<InProcessModuleCache>(Entries);
The module cache used for compiling modules implicitly.
IntrusiveRefCntPtr< ModuleCache > makeInProcessModuleCache(ModuleCacheEntries &Entries)
The JSON file list parser is used to communicate input to InstallAPI.
void maybePruneImpl(StringRef Path, time_t PruneInterval, time_t PruneAfter)
Shared implementation of ModuleCache::maybePrune().