Changeset View
Changeset View
Standalone View
Standalone View
cfe/trunk/include/clang/Basic/FileSystemStatCache.h
Show First 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | |||||
}; | }; | ||||
/// Abstract interface for introducing a FileManager cache for 'stat' | /// Abstract interface for introducing a FileManager cache for 'stat' | ||||
/// system calls, which is used by precompiled and pretokenized headers to | /// system calls, which is used by precompiled and pretokenized headers to | ||||
/// improve performance. | /// improve performance. | ||||
class FileSystemStatCache { | class FileSystemStatCache { | ||||
virtual void anchor(); | virtual void anchor(); | ||||
protected: | |||||
std::unique_ptr<FileSystemStatCache> NextStatCache; | |||||
public: | public: | ||||
virtual ~FileSystemStatCache() = default; | virtual ~FileSystemStatCache() = default; | ||||
enum LookupResult { | enum LookupResult { | ||||
/// We know the file exists and its cached stat data. | /// We know the file exists and its cached stat data. | ||||
CacheExists, | CacheExists, | ||||
/// We know that the file doesn't exist. | /// We know that the file doesn't exist. | ||||
Show All 9 Lines | public: | ||||
/// (not directories). If it is false this lookup should only return | /// (not directories). If it is false this lookup should only return | ||||
/// success for directories (not files). On a successful file lookup, the | /// success for directories (not files). On a successful file lookup, the | ||||
/// implementation can optionally fill in \p F with a valid \p File object and | /// implementation can optionally fill in \p F with a valid \p File object and | ||||
/// the client guarantees that it will close it. | /// the client guarantees that it will close it. | ||||
static bool get(StringRef Path, FileData &Data, bool isFile, | static bool get(StringRef Path, FileData &Data, bool isFile, | ||||
std::unique_ptr<llvm::vfs::File> *F, | std::unique_ptr<llvm::vfs::File> *F, | ||||
FileSystemStatCache *Cache, llvm::vfs::FileSystem &FS); | FileSystemStatCache *Cache, llvm::vfs::FileSystem &FS); | ||||
/// Sets the next stat call cache in the chain of stat caches. | |||||
/// Takes ownership of the given stat cache. | |||||
void setNextStatCache(std::unique_ptr<FileSystemStatCache> Cache) { | |||||
NextStatCache = std::move(Cache); | |||||
} | |||||
/// Retrieve the next stat call cache in the chain. | |||||
FileSystemStatCache *getNextStatCache() { return NextStatCache.get(); } | |||||
/// Retrieve the next stat call cache in the chain, transferring | |||||
/// ownership of this cache (and, transitively, all of the remaining caches) | |||||
/// to the caller. | |||||
std::unique_ptr<FileSystemStatCache> takeNextStatCache() { | |||||
return std::move(NextStatCache); | |||||
} | |||||
protected: | protected: | ||||
// FIXME: The pointer here is a non-owning/optional reference to the | // FIXME: The pointer here is a non-owning/optional reference to the | ||||
// unique_ptr. Optional<unique_ptr<vfs::File>&> might be nicer, but | // unique_ptr. Optional<unique_ptr<vfs::File>&> might be nicer, but | ||||
// Optional needs some work to support references so this isn't possible yet. | // Optional needs some work to support references so this isn't possible yet. | ||||
virtual LookupResult getStat(StringRef Path, FileData &Data, bool isFile, | virtual LookupResult getStat(StringRef Path, FileData &Data, bool isFile, | ||||
std::unique_ptr<llvm::vfs::File> *F, | std::unique_ptr<llvm::vfs::File> *F, | ||||
llvm::vfs::FileSystem &FS) = 0; | llvm::vfs::FileSystem &FS) = 0; | ||||
LookupResult statChained(StringRef Path, FileData &Data, bool isFile, | |||||
std::unique_ptr<llvm::vfs::File> *F, | |||||
llvm::vfs::FileSystem &FS) { | |||||
if (FileSystemStatCache *Next = getNextStatCache()) | |||||
return Next->getStat(Path, Data, isFile, F, FS); | |||||
// If we hit the end of the list of stat caches to try, just compute and | |||||
// return it without a cache. | |||||
return get(Path, Data, isFile, F, nullptr, FS) ? CacheMissing : CacheExists; | |||||
} | |||||
}; | }; | ||||
/// A stat "cache" that can be used by FileManager to keep | /// A stat "cache" that can be used by FileManager to keep | ||||
/// track of the results of stat() calls that occur throughout the | /// track of the results of stat() calls that occur throughout the | ||||
/// execution of the front end. | /// execution of the front end. | ||||
class MemorizeStatCalls : public FileSystemStatCache { | class MemorizeStatCalls : public FileSystemStatCache { | ||||
public: | public: | ||||
/// The set of stat() calls that have been seen. | /// The set of stat() calls that have been seen. | ||||
Show All 16 Lines |