From 239330017c97fa3f6b4b2670ab570e822d6affb0 Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Wed, 29 Oct 2025 20:26:47 -0500 Subject: DiscIO: Make all BlobReader implementations use DirectIOFile to make CopyReader functionality thread safe. --- Source/Core/DiscIO/SplitFileBlob.cpp | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) (limited to 'Source/Core/DiscIO/SplitFileBlob.cpp') diff --git a/Source/Core/DiscIO/SplitFileBlob.cpp b/Source/Core/DiscIO/SplitFileBlob.cpp index 4756088a40..c6a3dbd987 100644 --- a/Source/Core/DiscIO/SplitFileBlob.cpp +++ b/Source/Core/DiscIO/SplitFileBlob.cpp @@ -4,17 +4,11 @@ #include "DiscIO/SplitFileBlob.h" #include -#include #include #include #include -#include "Common/Assert.h" -#include "Common/FileUtil.h" -#include "Common/IOFile.h" -#include "Common/MsgHandler.h" - namespace DiscIO { SplitPlainFileReader::SplitPlainFileReader(std::vector files) @@ -38,7 +32,7 @@ std::unique_ptr SplitPlainFileReader::Create(std::string_v u64 offset = 0; while (true) { - File::IOFile f(fmt::format("{}.part{}.iso", base_path, index), "rb"); + File::DirectIOFile f(fmt::format("{}.part{}.iso", base_path, index), File::AccessMode::Read); if (!f.IsOpen()) break; const u64 size = f.GetSize(); @@ -58,13 +52,7 @@ std::unique_ptr SplitPlainFileReader::Create(std::string_v std::unique_ptr SplitPlainFileReader::CopyReader() const { - std::vector new_files{}; - for (const SingleFile& file : m_files) - { - new_files.push_back( - {.file = file.file.Duplicate("rb"), .offset = file.offset, .size = file.size}); - } - return std::unique_ptr(new SplitPlainFileReader(std::move(new_files))); + return std::unique_ptr{new SplitPlainFileReader(m_files)}; } bool SplitPlainFileReader::Read(u64 offset, u64 nbytes, u8* out_ptr) @@ -80,13 +68,10 @@ bool SplitPlainFileReader::Read(u64 offset, u64 nbytes, u8* out_ptr) if (current_offset >= file.offset && current_offset < file.offset + file.size) { auto& f = file.file; - const u64 seek_offset = current_offset - file.offset; - const u64 current_read = std::min(file.size - seek_offset, rest); - if (!f.Seek(seek_offset, File::SeekOrigin::Begin) || !f.ReadBytes(out, current_read)) - { - f.ClearError(); + const u64 offset_in_file = current_offset - file.offset; + const u64 current_read = std::min(file.size - offset_in_file, rest); + if (!f.OffsetRead(offset_in_file, out, current_read)) return false; - } rest -= current_read; if (rest == 0) -- cgit v1.2.3