12#include "llvm/Support/AdvisoryLock.h"
13#include "llvm/Support/Chrono.h"
22class ReaderWriterLock :
public llvm::AdvisoryLock {
24 std::unique_lock<std::shared_mutex> OwningLock;
27 ReaderWriterLock(std::shared_mutex &Mutex)
28 : OwningLock(Mutex, std::defer_lock) {}
30 Expected<bool> tryLock()
override {
return OwningLock.try_lock(); }
32 llvm::WaitForUnlockResult
33 waitForUnlockFor(std::chrono::seconds MaxSeconds)
override {
39 std::shared_lock<std::shared_mutex> Lock(*OwningLock.mutex());
40 return llvm::WaitForUnlockResult::Success;
43 std::error_code unsafeMaybeUnlock()
override {
50 ~ReaderWriterLock()
override =
default;
54 ModuleCacheEntries &Entries;
60 InMemoryModuleCache InMemory;
63 InProcessModuleCache(ModuleCacheEntries &Entries) : Entries(Entries) {}
65 void prepareForGetLock(StringRef Filename)
override {}
67 std::unique_ptr<llvm::AdvisoryLock> getLock(StringRef Filename)
override {
68 auto &CompilationMutex = [&]() -> std::shared_mutex & {
69 std::lock_guard<std::mutex> Lock(Entries.Mutex);
70 auto &Entry = Entries.Map[Filename];
72 Entry = std::make_unique<ModuleCacheEntry>();
73 return Entry->CompilationMutex;
75 return std::make_unique<ReaderWriterLock>(CompilationMutex);
78 std::time_t getModuleTimestamp(StringRef Filename)
override {
79 auto &Timestamp = [&]() -> std::atomic<std::time_t> & {
80 std::lock_guard<std::mutex> Lock(Entries.Mutex);
81 auto &Entry = Entries.Map[Filename];
83 Entry = std::make_unique<ModuleCacheEntry>();
84 return Entry->Timestamp;
87 return Timestamp.load();
90 void updateModuleTimestamp(StringRef Filename)
override {
92 auto &Timestamp = [&]() -> std::atomic<std::time_t> & {
93 std::lock_guard<std::mutex> Lock(Entries.Mutex);
94 auto &Entry = Entries.Map[Filename];
96 Entry = std::make_unique<ModuleCacheEntry>();
97 return Entry->Timestamp;
100 Timestamp.store(llvm::sys::toTimeT(std::chrono::system_clock::now()));
103 InMemoryModuleCache &getInMemoryModuleCache()
override {
return InMemory; }
104 const InMemoryModuleCache &getInMemoryModuleCache()
const override {
112 return llvm::makeIntrusiveRefCnt<InProcessModuleCache>(Entries);
The module cache used for compiling modules implicitly.
The JSON file list parser is used to communicate input to InstallAPI.