From 5cea0d9defeaa23e7af94adf7615a44fb2c9c173 Mon Sep 17 00:00:00 2001 From: skidau Date: Wed, 27 Mar 2013 13:06:15 +1100 Subject: [PATCH] Revert "Don't open/close file for every file operation." as it was crashing PokePark in Windows builds. This reverts commit efcb2abe9bf60978d2e5e776268179671bfef87a. Fixes issue 6098. --- .../Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp | 76 ++++++++----------- .../Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.h | 5 +- 2 files changed, 35 insertions(+), 46 deletions(-) diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp index acf5c921e9..6647fdcd49 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp @@ -103,36 +103,27 @@ bool CWII_IPC_HLE_Device_FileIO::Open(u32 _CommandAddress, u32 _Mode) return true; } -// Opens file if needed. -// Clears any error state. -// Seeks to proper position position. -void CWII_IPC_HLE_Device_FileIO::PrepareFile() +File::IOFile CWII_IPC_HLE_Device_FileIO::OpenFile() { - if (!m_file.IsOpen()) + const char* open_mode = ""; + + switch (m_Mode) { - const char* open_mode = ""; - - switch (m_Mode) - { - case ISFS_OPEN_READ: - open_mode = "rb"; - break; - - case ISFS_OPEN_WRITE: - case ISFS_OPEN_RW: - open_mode = "r+b"; - break; - - default: - PanicAlertT("FileIO: Unknown open mode : 0x%02x", m_Mode); - break; - } - - m_file.Open(m_filepath, open_mode); + case ISFS_OPEN_READ: + open_mode = "rb"; + break; + + case ISFS_OPEN_WRITE: + case ISFS_OPEN_RW: + open_mode = "r+b"; + break; + + default: + PanicAlertT("FileIO: Unknown open mode : 0x%02x", m_Mode); + break; } - m_file.Clear(); - m_file.Seek(m_SeekPos, SEEK_SET); + return File::IOFile(m_filepath, open_mode); } bool CWII_IPC_HLE_Device_FileIO::Seek(u32 _CommandAddress) @@ -141,12 +132,11 @@ bool CWII_IPC_HLE_Device_FileIO::Seek(u32 _CommandAddress) const u32 SeekOffset = Memory::Read_U32(_CommandAddress + 0xC); const u32 Mode = Memory::Read_U32(_CommandAddress + 0x10); - PrepareFile(); - if (m_file) + if (auto file = OpenFile()) { ReturnValue = FS_RESULT_FATAL; - const u64 fileSize = m_file.GetSize(); + const u64 fileSize = file.GetSize(); INFO_LOG(WII_IPC_FILEIO, "FileIO: Seek Pos: 0x%08x, Mode: %i (%s, Length=0x%08llx)", SeekOffset, Mode, m_Name.c_str(), fileSize); u64 wantedPos = 0; switch (Mode) @@ -156,7 +146,7 @@ bool CWII_IPC_HLE_Device_FileIO::Seek(u32 _CommandAddress) break; case 1: - wantedPos = m_SeekPos + (s32)SeekOffset; + wantedPos = m_SeekPos + SeekOffset; break; case 2: @@ -190,9 +180,9 @@ bool CWII_IPC_HLE_Device_FileIO::Read(u32 _CommandAddress) u32 ReturnValue = FS_EACCESS; const u32 Address = Memory::Read_U32(_CommandAddress + 0xC); // Read to this memory address const u32 Size = Memory::Read_U32(_CommandAddress + 0x10); - - PrepareFile(); - if (m_file) + + + if (auto file = OpenFile()) { if (m_Mode == ISFS_OPEN_WRITE) { @@ -201,8 +191,9 @@ bool CWII_IPC_HLE_Device_FileIO::Read(u32 _CommandAddress) else { INFO_LOG(WII_IPC_FILEIO, "FileIO: Read 0x%x bytes to 0x%08x from %s", Size, Address, m_Name.c_str()); - ReturnValue = (u32)fread(Memory::GetPointer(Address), 1, Size, m_file.GetHandle()); - if (ReturnValue != Size && ferror(m_file.GetHandle())) + file.Seek(m_SeekPos, SEEK_SET); + ReturnValue = (u32)fread(Memory::GetPointer(Address), 1, Size, file.GetHandle()); + if (ReturnValue != Size && ferror(file.GetHandle())) { ReturnValue = FS_EACCESS; } @@ -229,8 +220,8 @@ bool CWII_IPC_HLE_Device_FileIO::Write(u32 _CommandAddress) const u32 Address = Memory::Read_U32(_CommandAddress + 0xC); // Write data from this memory address const u32 Size = Memory::Read_U32(_CommandAddress + 0x10); - PrepareFile(); - if (m_file) + + if (auto file = OpenFile()) { if (m_Mode == ISFS_OPEN_READ) { @@ -239,7 +230,8 @@ bool CWII_IPC_HLE_Device_FileIO::Write(u32 _CommandAddress) else { INFO_LOG(WII_IPC_FILEIO, "FileIO: Write 0x%04x bytes from 0x%08x to %s", Size, Address, m_Name.c_str()); - if (m_file.WriteBytes(Memory::GetPointer(Address), Size)) + file.Seek(m_SeekPos, SEEK_SET); + if (file.WriteBytes(Memory::GetPointer(Address), Size)) { ReturnValue = Size; m_SeekPos += Size; @@ -269,10 +261,9 @@ bool CWII_IPC_HLE_Device_FileIO::IOCtl(u32 _CommandAddress) { case ISFS_IOCTL_GETFILESTATS: { - PrepareFile(); - if (m_file) + if (auto file = OpenFile()) { - u32 m_FileLength = (u32)m_file.GetSize(); + u32 m_FileLength = (u32)file.GetSize(); const u32 BufferOut = Memory::Read_U32(_CommandAddress + 0x18); INFO_LOG(WII_IPC_FILEIO, "FileIO: ISFS_IOCTL_GETFILESTATS"); @@ -307,7 +298,6 @@ void CWII_IPC_HLE_Device_FileIO::DoState(PointerWrap &p) p.Do(m_Mode); p.Do(m_SeekPos); - - m_file.Close(); + m_filepath = HLE_IPC_BuildFilename(m_Name, 64); } diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.h index fd33d7d69c..7cdff98a95 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.h +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.h @@ -38,9 +38,9 @@ public: bool IOCtl(u32 _CommandAddress); void DoState(PointerWrap &p); + File::IOFile OpenFile(); + private: - void PrepareFile(); - enum { ISFS_OPEN_READ = 1, @@ -76,7 +76,6 @@ private: u32 m_Mode; u32 m_SeekPos; - File::IOFile m_file; std::string m_filepath; };