зеркало из https://github.com/microsoft/clang-1.git
Added to FileEntry a pointer to the <dev_t,ino_t> pair for the file, and
accessors to FileEntry to query these values. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45171 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
2b9d2ca4ce
Коммит
da9954400a
|
@ -65,7 +65,7 @@ const DirectoryEntry *FileManager::getDirectory(const char *NameStart,
|
|||
return 0;
|
||||
|
||||
// It exists. See if we have already opened a directory with the same inode.
|
||||
// This occurs when one dir is symlinked to another, for example.
|
||||
// This occurs when one dir is symlinked to another, for example.
|
||||
DirectoryEntry &UDE =
|
||||
UniqueDirs[std::make_pair(StatBuf.st_dev, StatBuf.st_ino)];
|
||||
|
||||
|
@ -144,7 +144,12 @@ const FileEntry *FileManager::getFile(const char *NameStart,
|
|||
|
||||
// It exists. See if we have already opened a directory with the same inode.
|
||||
// This occurs when one dir is symlinked to another, for example.
|
||||
FileEntry &UFE = UniqueFiles[std::make_pair(StatBuf.st_dev, StatBuf.st_ino)];
|
||||
std::pair<FileEntryMap::iterator,bool> X =
|
||||
UniqueFiles.insert(FileEntryMap::value_type(std::make_pair(StatBuf.st_dev,
|
||||
StatBuf.st_ino),
|
||||
FileEntry()));
|
||||
|
||||
FileEntry &UFE = X.first->second;
|
||||
|
||||
NamedFileEnt.setValue(&UFE);
|
||||
if (UFE.getName()) // Already have an entry with this inode, return it.
|
||||
|
@ -158,6 +163,7 @@ const FileEntry *FileManager::getFile(const char *NameStart,
|
|||
UFE.ModTime = StatBuf.st_mtime;
|
||||
UFE.Dir = DirInfo;
|
||||
UFE.UID = NextFileUID++;
|
||||
UFE.InoDev = &X.first->first;
|
||||
return &UFE;
|
||||
}
|
||||
|
||||
|
|
|
@ -42,13 +42,16 @@ class FileEntry {
|
|||
time_t ModTime; // Modification time of file.
|
||||
const DirectoryEntry *Dir; // Directory file lives in.
|
||||
unsigned UID; // A unique (small) ID for the file.
|
||||
const std::pair<dev_t, ino_t>* InoDev; // Pointer to inode/device number pair.
|
||||
friend class FileManager;
|
||||
public:
|
||||
FileEntry() : Name(0) {}
|
||||
FileEntry() : Name(0), InoDev(NULL) {}
|
||||
|
||||
const char *getName() const { return Name; }
|
||||
off_t getSize() const { return Size; }
|
||||
unsigned getUID() const { return UID; }
|
||||
ino_t getInode() const { return InoDev->second; }
|
||||
dev_t getDev() const { return InoDev->first; }
|
||||
time_t getModificationTime() const { return ModTime; }
|
||||
|
||||
/// getDir - Return the directory the file lives in.
|
||||
|
@ -66,7 +69,9 @@ class FileManager {
|
|||
/// UniqueDirs/UniqueFiles - Cache from ID's to existing directories/files.
|
||||
///
|
||||
std::map<std::pair<dev_t, ino_t>, DirectoryEntry> UniqueDirs;
|
||||
std::map<std::pair<dev_t, ino_t>, FileEntry> UniqueFiles;
|
||||
|
||||
typedef std::map<std::pair<dev_t, ino_t>, FileEntry> FileEntryMap;
|
||||
FileEntryMap UniqueFiles;
|
||||
|
||||
/// DirEntries/FileEntries - This is a cache of directory/file entries we have
|
||||
/// looked up. The actual Entry is owned by UniqueFiles/UniqueDirs above.
|
||||
|
|
Загрузка…
Ссылка в новой задаче