vfs_real: lazily open files

merge-requests/60/head
Liam 2023-06-11 23:53:23 +07:00
parent f25236a4d6
commit 0e7eaaba5a
2 changed files with 3 additions and 11 deletions

@ -75,16 +75,9 @@ VfsEntryType RealVfsFilesystem::GetEntryType(std::string_view path_) const {
VirtualFile RealVfsFilesystem::OpenFile(std::string_view path_, Mode perms) { VirtualFile RealVfsFilesystem::OpenFile(std::string_view path_, Mode perms) {
const auto path = FS::SanitizePath(path_, FS::DirectorySeparator::PlatformDefault); const auto path = FS::SanitizePath(path_, FS::DirectorySeparator::PlatformDefault);
this->EvictSingleReference(); auto reference = std::make_unique<FileReference>();
auto backing = FS::FileOpen(path, ModeFlagsToFileAccessMode(perms), FS::FileType::BinaryFile);
if (!backing) {
return nullptr;
}
num_open_files++;
auto reference = std::make_unique<FileReference>(std::move(backing));
this->InsertReferenceIntoList(*reference); this->InsertReferenceIntoList(*reference);
return std::shared_ptr<RealVfsFile>(new RealVfsFile(*this, std::move(reference), path, perms)); return std::shared_ptr<RealVfsFile>(new RealVfsFile(*this, std::move(reference), path, perms));
} }

@ -15,8 +15,7 @@ class IOFile;
namespace FileSys { namespace FileSys {
struct FileReference : public Common::IntrusiveListBaseNode<FileReference> { struct FileReference : public Common::IntrusiveListBaseNode<FileReference> {
FileReference(std::shared_ptr<Common::FS::IOFile>&& f) : file(f) {} std::shared_ptr<Common::FS::IOFile> file{};
std::shared_ptr<Common::FS::IOFile> file;
}; };
class RealVfsFile; class RealVfsFile;