================ @@ -59,19 +60,46 @@ class InProcessModuleCache : public ModuleCache { InMemoryModuleCache InMemory; public: - InProcessModuleCache(ModuleCacheMutexes &Mutexes) : Mutexes(Mutexes) {} + InProcessModuleCache(ModuleCacheEntries &Entries) : Entries(Entries) {} void prepareForGetLock(StringRef Filename) override {} std::unique_ptr<llvm::AdvisoryLock> getLock(StringRef Filename) override { - auto &Mtx = [&]() -> std::shared_mutex & { - std::lock_guard<std::mutex> Lock(Mutexes.Mutex); - auto &Mutex = Mutexes.Map[Filename]; - if (!Mutex) - Mutex = std::make_unique<std::shared_mutex>(); - return *Mutex; + auto &CompilationMutex = [&]() -> std::shared_mutex & { + std::lock_guard Lock(Entries.Mutex); + auto &Entry = Entries.Map[Filename]; + if (!Entry) + Entry = std::make_unique<ModuleCacheEntry>(); + return Entry->CompilationMutex; }(); - return std::make_unique<ReaderWriterLock>(Mtx); + return std::make_unique<ReaderWriterLock>(CompilationMutex); + } + + std::time_t getModuleTimestamp(StringRef Filename) override { + auto &Timestamp = [&]() -> std::atomic<std::time_t> & { + std::lock_guard Lock(Entries.Mutex); + auto &Entry = Entries.Map[Filename]; + if (!Entry) + Entry = std::make_unique<ModuleCacheEntry>(); + return Entry->Timestamp; + }(); + + return Timestamp.load(); + } + + void updateModuleTimestamp(StringRef Filename) override { + // Note: This essentially replaces FS contention with mutex contention. + auto &Timestamp = [&]() -> std::atomic<std::time_t> & { + std::lock_guard Lock(Entries.Mutex); + auto &Entry = Entries.Map[Filename]; + if (!Entry) + Entry = std::make_unique<ModuleCacheEntry>(); + return Entry->Timestamp; + }(); + + std::time_t Expected = 0; + std::time_t Now = llvm::sys::toTimeT(std::chrono::system_clock::now()); + Timestamp.compare_exchange_weak(Expected, Now); ---------------- jansvoboda11 wrote:
That's a good point. Let me keep the newest timestamp to keep both implementations as close to each other as possible. https://github.com/llvm/llvm-project/pull/137363 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits