Improve memory ownership of vfs::Files in the FileSystemStatCache by using std::unique_ptr
Spotted after a memory leak (due to the complexities of manual memory management) was fixed in 212466. llvm-svn: 212541
This commit is contained in:
@@ -52,8 +52,8 @@ static void copyStatusToFileData(const vfs::Status &Status,
|
||||
/// implementation can optionally fill in FileDescriptor with a valid
|
||||
/// descriptor and the client guarantees that it will close it.
|
||||
bool FileSystemStatCache::get(const char *Path, FileData &Data, bool isFile,
|
||||
vfs::File **F, FileSystemStatCache *Cache,
|
||||
vfs::FileSystem &FS) {
|
||||
std::unique_ptr<vfs::File> *F,
|
||||
FileSystemStatCache *Cache, vfs::FileSystem &FS) {
|
||||
LookupResult R;
|
||||
bool isForDir = !isFile;
|
||||
|
||||
@@ -92,7 +92,7 @@ bool FileSystemStatCache::get(const char *Path, FileData &Data, bool isFile,
|
||||
if (Status) {
|
||||
R = CacheExists;
|
||||
copyStatusToFileData(*Status, Data);
|
||||
*F = OwnedFile.release();
|
||||
*F = std::move(OwnedFile);
|
||||
} else {
|
||||
// fstat rarely fails. If it does, claim the initial open didn't
|
||||
// succeed.
|
||||
@@ -109,11 +109,8 @@ bool FileSystemStatCache::get(const char *Path, FileData &Data, bool isFile,
|
||||
// demands.
|
||||
if (Data.IsDirectory != isForDir) {
|
||||
// If not, close the file if opened.
|
||||
if (F && *F) {
|
||||
(*F)->close();
|
||||
delete *F;
|
||||
if (F)
|
||||
*F = nullptr;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -123,7 +120,7 @@ bool FileSystemStatCache::get(const char *Path, FileData &Data, bool isFile,
|
||||
|
||||
MemorizeStatCalls::LookupResult
|
||||
MemorizeStatCalls::getStat(const char *Path, FileData &Data, bool isFile,
|
||||
vfs::File **F, vfs::FileSystem &FS) {
|
||||
std::unique_ptr<vfs::File> *F, vfs::FileSystem &FS) {
|
||||
LookupResult Result = statChained(Path, Data, isFile, F, FS);
|
||||
|
||||
// Do not cache failed stats, it is easy to construct common inconsistent
|
||||
|
||||
Reference in New Issue
Block a user