================
@@ -262,44 +357,73 @@
DependencyScanningWorkerFilesystem::getOrEmplaceSharedEntryForUID(
std::move(TEntry.Contents));
}
-const CachedFileSystemEntry *
-DependencyScanningWorkerFilesystem::findEntryByFilenameWithWriteThrough(
- StringRef Filename) {
- if (const auto *Entry = LocalCache.findEntryByFilename(Filename))
- return Entry;
- auto &Shard = SharedCache.getShardForFilename(Filename);
- if (const auto *Entry = Shard.findEntryByFilename(Filename))
- return &LocalCache.insertEntryForFilename(Filename, *Entry);
- return nullptr;
-}
-
llvm::ErrorOr<const CachedFileSystemEntry &>
DependencyScanningWorkerFilesystem::computeAndStoreResult(
StringRef OriginalFilename, StringRef FilenameForLookup) {
- llvm::ErrorOr<llvm::vfs::Status> Stat =
- getUnderlyingFS().status(OriginalFilename);
- if (!Stat) {
- const auto &Entry =
- getOrEmplaceSharedEntryForFilename(FilenameForLookup, Stat.getError());
- return insertLocalEntryForFilename(FilenameForLookup, Entry);
- }
-
- if (const auto *Entry = findSharedEntryByUID(*Stat))
- return insertLocalEntryForFilename(FilenameForLookup, *Entry);
-
- auto TEntry =
- Stat->isDirectory() ? TentativeEntry(*Stat) : readFile(OriginalFilename);
+ auto &FilenameShard = SharedCache.getShardForFilename(FilenameForLookup);
+
+ // Acquire a per-filename in-progress entry. If another worker has already
+ // produced an entry under this filename, or is currently producing one,
+ // adopt its result instead of duplicating the underlying filesystem.
+ auto FilenameSlot = FilenameShard.acquireFilenameSlot(FilenameForLookup);
+ if (FilenameSlot.Resolved)
+ return insertLocalEntryForFilename(FilenameForLookup,
+ *FilenameSlot.Resolved);
+
+ // Compute the result.
+ std::shared_ptr<DependencyScanningFilesystemSharedCache::InProgressEntry>
+ ProducerSlot = std::move(FilenameSlot.Produce);
+ const CachedFileSystemEntry *ProducedEntry = nullptr;
+ auto ComputeResult = [&]() -> llvm::ErrorOr<const CachedFileSystemEntry &> {
+ llvm::ErrorOr<llvm::vfs::Status> Stat =
+ getUnderlyingFS().status(OriginalFilename);
+ if (!Stat) {
+ const auto &Entry = getOrEmplaceSharedEntryForFilename(FilenameForLookup,
+ Stat.getError());
+ ProducedEntry = &Entry;
----------------
artemcm wrote:
Done. Thanks.
https://github.com/llvm/llvm-project/pull/199680
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits