From 3c8b3f9a290f99368814465e0c5a13ac6921c942 Mon Sep 17 00:00:00 2001 From: IndecisiveTurtle <47210458+raphaelthegreat@users.noreply.github.com> Date: Mon, 15 Jul 2024 15:14:04 +0300 Subject: [PATCH] fs: Remove some unnecessary string conversions --- src/core/file_sys/fs.cpp | 11 +++-------- src/core/file_sys/fs.h | 4 ++-- src/core/libraries/kernel/file_system.cpp | 8 ++++---- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/core/file_sys/fs.cpp b/src/core/file_sys/fs.cpp index bfbd6737..5f462937 100644 --- a/src/core/file_sys/fs.cpp +++ b/src/core/file_sys/fs.cpp @@ -131,14 +131,9 @@ File* HandleTable::GetFile(int d) { return m_files.at(d - RESERVED_HANDLES); } -File* HandleTable::getFile(const std::string& host_name) { - std::scoped_lock lock{m_mutex}; - for (auto* file : m_files) { - if (file != nullptr && file->m_host_name == host_name) { - return file; - } - } - return nullptr; +File* HandleTable::GetFile(const std::filesystem::path& host_name) { + const auto it = std::ranges::find(m_files, host_name, &File::m_host_name); + return it == m_files.end() ? nullptr : *it; } } // namespace Core::FileSys diff --git a/src/core/file_sys/fs.h b/src/core/file_sys/fs.h index ede386e5..d636f8bf 100644 --- a/src/core/file_sys/fs.h +++ b/src/core/file_sys/fs.h @@ -54,7 +54,7 @@ struct DirEntry { struct File { std::atomic_bool is_opened{}; std::atomic_bool is_directory{}; - std::string m_host_name; + std::filesystem::path m_host_name; std::string m_guest_name; Common::FS::IOFile f; std::vector dirents; @@ -70,7 +70,7 @@ public: int CreateHandle(); void DeleteHandle(int d); File* GetFile(int d); - File* getFile(const std::string& host_name); + File* GetFile(const std::filesystem::path& host_name); private: std::vector m_files; diff --git a/src/core/libraries/kernel/file_system.cpp b/src/core/libraries/kernel/file_system.cpp index f56b05da..23b949a8 100644 --- a/src/core/libraries/kernel/file_system.cpp +++ b/src/core/libraries/kernel/file_system.cpp @@ -13,7 +13,7 @@ namespace Libraries::Kernel { -std::vector GetDirectoryEntries(const std::string& path) { +std::vector GetDirectoryEntries(const std::filesystem::path& path) { std::vector files; for (const auto& entry : std::filesystem::directory_iterator(path)) { auto& dir_entry = files.emplace_back(); @@ -58,7 +58,7 @@ int PS4_SYSV_ABI sceKernelOpen(const char* path, int flags, u16 mode) { if (directory) { file->is_directory = true; file->m_guest_name = path; - file->m_host_name = mnt->GetHostPath(file->m_guest_name).string(); + file->m_host_name = mnt->GetHostPath(file->m_guest_name); if (!std::filesystem::is_directory(file->m_host_name)) { // directory doesn't exist h->DeleteHandle(handle); return ORBIS_KERNEL_ERROR_ENOTDIR; @@ -72,7 +72,7 @@ int PS4_SYSV_ABI sceKernelOpen(const char* path, int flags, u16 mode) { } } else { file->m_guest_name = path; - file->m_host_name = mnt->GetHostPath(file->m_guest_name).string(); + file->m_host_name = mnt->GetHostPath(file->m_guest_name); int e = 0; if (read) { e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Read); @@ -174,7 +174,7 @@ int PS4_SYSV_ABI sceKernelUnlink(const char* path) { return SCE_KERNEL_ERROR_EPERM; } - auto* file = h->getFile(host_path.string()); + auto* file = h->GetFile(host_path); if (file != nullptr) { file->f.Unlink(); }