]> granicus.if.org Git - clang/commitdiff
factor the "cache miss" handling code out of FM into a static
authorChris Lattner <sabre@nondot.org>
Tue, 23 Nov 2010 19:56:39 +0000 (19:56 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 23 Nov 2010 19:56:39 +0000 (19:56 +0000)
method in FileSystemStatCache.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@120037 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/FileSystemStatCache.h
lib/Basic/FileManager.cpp

index bcfa52dd8658c729daf3a2979ab7568a545e0580..7bb3706793153f9aeef93fdcb35945afbc740f51 100644 (file)
@@ -36,8 +36,21 @@ public:
     CacheHitMissing,  //< We know that the file doesn't exist.
     CacheMiss         //< We don't know anything about the file.
   };
-  
-  virtual LookupResult getStat(const char *Path, struct stat &StatBuf) = 0;
+
+  /// FileSystemStatCache::get - Get the 'stat' information for the specified
+  /// path, using the cache to accellerate it if possible.  This returns true if
+  /// the path does not exist or false if it exists.
+  static bool get(const char *Path, struct stat &StatBuf,
+                  FileSystemStatCache *Cache) {
+    LookupResult R = CacheMiss;
+    
+    if (Cache)
+      R = Cache->getStat(Path, StatBuf);
+    
+    if (R == FileSystemStatCache::CacheMiss)
+      return ::stat(Path, &StatBuf);
+    return R == FileSystemStatCache::CacheHitMissing;
+  }
   
   /// \brief Sets the next stat call cache in the chain of stat caches.
   /// Takes ownership of the given stat cache.
@@ -54,6 +67,8 @@ public:
   FileSystemStatCache *takeNextStatCache() { return NextStatCache.take(); }
   
 protected:
+  virtual LookupResult getStat(const char *Path, struct stat &StatBuf) = 0;
+
   LookupResult statChained(const char *Path, struct stat &StatBuf) {
     if (FileSystemStatCache *Next = getNextStatCache())
       return Next->getStat(Path, StatBuf);
index b884388c0b5eb3ae79226cbfe931d1921d90f3b3..7bb67689bf1138c820f775c1fee84b83ea032abb 100644 (file)
@@ -306,14 +306,12 @@ const FileEntry *FileManager::getFile(llvm::StringRef Filename) {
 
   // Nope, there isn't.  Check to see if the file exists.
   struct stat StatBuf;
-  //llvm::errs() << "STATING: " << Filename;
   if (getStatValue(InterndFileName, StatBuf) ||    // Error stat'ing.
       S_ISDIR(StatBuf.st_mode)) {                  // A directory?
-    // If this file doesn't exist, we leave a null in FileEntries for this path.
-    //llvm::errs() << ": Not existing\n";
+    // If this file doesn't exist, we leave NON_EXISTENT_FILE in FileEntries for
+    // this path so subsequent queries get the negative result.
     return 0;
   }
-  //llvm::errs() << ": exists\n";
 
   // It exists.  See if we have already opened a file with the same inode.
   // This occurs when one dir is symlinked to another, for example.
@@ -416,28 +414,15 @@ getBufferForFile(llvm::StringRef Filename, std::string *ErrorStr) {
 /// cache to accellerate it if possible.  This returns true if the path does not
 /// exist or false if it exists.
 bool FileManager::getStatValue(const char *Path, struct stat &StatBuf) {
-  FileSystemStatCache::LookupResult Result = FileSystemStatCache::CacheMiss;
-  
   // FIXME: FileSystemOpts shouldn't be passed in here, all paths should be
   // absolute!
-  if (FileSystemOpts.WorkingDir.empty()) {
-    if (StatCache.get())
-      Result = StatCache->getStat(Path, StatBuf);
-    
-    if (Result == FileSystemStatCache::CacheMiss)
-      return ::stat(Path, &StatBuf);
-    return Result == FileSystemStatCache::CacheHitMissing;
-  }
+  if (FileSystemOpts.WorkingDir.empty())
+    return FileSystemStatCache::get(Path, StatBuf, StatCache.get());
   
   llvm::sys::Path FilePath(Path);
   FixupRelativePath(FilePath, FileSystemOpts);
-  
-  if (StatCache.get())
-    Result = StatCache->getStat(FilePath.c_str(), StatBuf);
-  
-  if (Result == FileSystemStatCache::CacheMiss)
-    return ::stat(FilePath.c_str(), &StatBuf);
-  return Result == FileSystemStatCache::CacheHitMissing;
+
+  return FileSystemStatCache::get(FilePath.c_str(), StatBuf, StatCache.get());
 }