[PATCH] D51641: [VFS] Cache the current working directory for the real FS.
Eric Liu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 4 10:17:49 PDT 2018
ioeric updated this revision to Diff 163858.
ioeric marked an inline comment as done.
ioeric added a comment.
- Guard CWDCache with mutex.
Repository:
rC Clang
https://reviews.llvm.org/D51641
Files:
lib/Basic/VirtualFileSystem.cpp
Index: lib/Basic/VirtualFileSystem.cpp
===================================================================
--- lib/Basic/VirtualFileSystem.cpp
+++ lib/Basic/VirtualFileSystem.cpp
@@ -25,9 +25,9 @@
#include "llvm/ADT/Twine.h"
#include "llvm/ADT/iterator_range.h"
#include "llvm/Config/llvm-config.h"
-#include "llvm/Support/Compiler.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Chrono.h"
+#include "llvm/Support/Compiler.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/Errc.h"
#include "llvm/Support/ErrorHandling.h"
@@ -48,6 +48,7 @@
#include <limits>
#include <map>
#include <memory>
+#include <mutex>
#include <string>
#include <system_error>
#include <utility>
@@ -243,6 +244,10 @@
std::error_code setCurrentWorkingDirectory(const Twine &Path) override;
std::error_code getRealPath(const Twine &Path,
SmallVectorImpl<char> &Output) const override;
+private:
+ // Make sure `CWDCache` update is thread safe in `getCurrentWorkingDirectory`.
+ mutable std::mutex Mutex;
+ mutable std::string CWDCache;
};
} // namespace
@@ -265,10 +270,14 @@
}
llvm::ErrorOr<std::string> RealFileSystem::getCurrentWorkingDirectory() const {
+ std::lock_guard<std::mutex> Lock(Mutex);
+ if (!CWDCache.empty())
+ return CWDCache;
SmallString<256> Dir;
if (std::error_code EC = llvm::sys::fs::current_path(Dir))
return EC;
- return Dir.str().str();
+ CWDCache = Dir.str();
+ return CWDCache;
}
std::error_code RealFileSystem::setCurrentWorkingDirectory(const Twine &Path) {
@@ -279,7 +288,13 @@
// difference for example on network filesystems, where symlinks might be
// switched during runtime of the tool. Fixing this depends on having a
// file system abstraction that allows openat() style interactions.
- return llvm::sys::fs::set_current_path(Path);
+ if (auto EC = llvm::sys::fs::set_current_path(Path))
+ return EC;
+
+ // Invalidate cache.
+ std::lock_guard<std::mutex> Lock(Mutex);
+ CWDCache.clear();
+ return std::error_code();
}
std::error_code
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D51641.163858.patch
Type: text/x-patch
Size: 2071 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180904/6c16c18b/attachment-0001.bin>
More information about the cfe-commits
mailing list