mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-15 22:54:00 +00:00
vfs_real: add simplified open file cache
This commit is contained in:
parent
0e7eaaba5a
commit
dbbe237668
2 changed files with 18 additions and 1 deletions
|
@ -75,14 +75,26 @@ 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);
|
||||||
|
|
||||||
|
if (auto it = cache.find(path); it != cache.end()) {
|
||||||
|
if (auto file = it->second.lock(); file) {
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto reference = std::make_unique<FileReference>();
|
auto reference = std::make_unique<FileReference>();
|
||||||
this->InsertReferenceIntoList(*reference);
|
this->InsertReferenceIntoList(*reference);
|
||||||
|
|
||||||
return std::shared_ptr<RealVfsFile>(new RealVfsFile(*this, std::move(reference), path, perms));
|
auto file =
|
||||||
|
std::shared_ptr<RealVfsFile>(new RealVfsFile(*this, std::move(reference), path, perms));
|
||||||
|
cache[path] = file;
|
||||||
|
|
||||||
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
VirtualFile RealVfsFilesystem::CreateFile(std::string_view path_, Mode perms) {
|
VirtualFile RealVfsFilesystem::CreateFile(std::string_view path_, Mode perms) {
|
||||||
const auto path = FS::SanitizePath(path_, FS::DirectorySeparator::PlatformDefault);
|
const auto path = FS::SanitizePath(path_, FS::DirectorySeparator::PlatformDefault);
|
||||||
|
cache.erase(path);
|
||||||
|
|
||||||
// Current usages of CreateFile expect to delete the contents of an existing file.
|
// Current usages of CreateFile expect to delete the contents of an existing file.
|
||||||
if (FS::IsFile(path)) {
|
if (FS::IsFile(path)) {
|
||||||
FS::IOFile temp{path, FS::FileAccessMode::Write, FS::FileType::BinaryFile};
|
FS::IOFile temp{path, FS::FileAccessMode::Write, FS::FileType::BinaryFile};
|
||||||
|
@ -111,6 +123,8 @@ VirtualFile RealVfsFilesystem::CopyFile(std::string_view old_path_, std::string_
|
||||||
VirtualFile RealVfsFilesystem::MoveFile(std::string_view old_path_, std::string_view new_path_) {
|
VirtualFile RealVfsFilesystem::MoveFile(std::string_view old_path_, std::string_view new_path_) {
|
||||||
const auto old_path = FS::SanitizePath(old_path_, FS::DirectorySeparator::PlatformDefault);
|
const auto old_path = FS::SanitizePath(old_path_, FS::DirectorySeparator::PlatformDefault);
|
||||||
const auto new_path = FS::SanitizePath(new_path_, FS::DirectorySeparator::PlatformDefault);
|
const auto new_path = FS::SanitizePath(new_path_, FS::DirectorySeparator::PlatformDefault);
|
||||||
|
cache.erase(old_path);
|
||||||
|
cache.erase(new_path);
|
||||||
if (!FS::RenameFile(old_path, new_path)) {
|
if (!FS::RenameFile(old_path, new_path)) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -119,6 +133,7 @@ VirtualFile RealVfsFilesystem::MoveFile(std::string_view old_path_, std::string_
|
||||||
|
|
||||||
bool RealVfsFilesystem::DeleteFile(std::string_view path_) {
|
bool RealVfsFilesystem::DeleteFile(std::string_view path_) {
|
||||||
const auto path = FS::SanitizePath(path_, FS::DirectorySeparator::PlatformDefault);
|
const auto path = FS::SanitizePath(path_, FS::DirectorySeparator::PlatformDefault);
|
||||||
|
cache.erase(path);
|
||||||
return FS::RemoveFile(path);
|
return FS::RemoveFile(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <map>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include "common/intrusive_list.h"
|
#include "common/intrusive_list.h"
|
||||||
#include "core/file_sys/mode.h"
|
#include "core/file_sys/mode.h"
|
||||||
|
@ -41,6 +42,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
using ReferenceListType = Common::IntrusiveListBaseTraits<FileReference>::ListType;
|
using ReferenceListType = Common::IntrusiveListBaseTraits<FileReference>::ListType;
|
||||||
|
std::map<std::string, std::weak_ptr<VfsFile>, std::less<>> cache;
|
||||||
ReferenceListType open_references;
|
ReferenceListType open_references;
|
||||||
ReferenceListType closed_references;
|
ReferenceListType closed_references;
|
||||||
size_t num_open_files{};
|
size_t num_open_files{};
|
||||||
|
|
Loading…
Reference in a new issue