aboutsummaryrefslogtreecommitdiff
path: root/src/zenutil/basicfile.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2024-01-29 13:38:17 +0100
committerGitHub <[email protected]>2024-01-29 13:38:17 +0100
commitb6f3294987f4e1bc9ec1f2fe83a4f5570cb89284 (patch)
treea240bcba5fb0fee915447db71c3801003b9b07d7 /src/zenutil/basicfile.cpp
parent0.2.39 (diff)
downloadzen-b6f3294987f4e1bc9ec1f2fe83a4f5570cb89284.tar.xz
zen-b6f3294987f4e1bc9ec1f2fe83a4f5570cb89284.zip
exception on basicfile read error (#642)
* Change BasicFile::Read to throw exception like IoBuffer - Don't ASSERT on dwNumberOfBytesRead == NumberOfBytesToRead - throw exception with details instead - Use proper return type for pread()
Diffstat (limited to 'src/zenutil/basicfile.cpp')
-rw-r--r--src/zenutil/basicfile.cpp36
1 files changed, 28 insertions, 8 deletions
diff --git a/src/zenutil/basicfile.cpp b/src/zenutil/basicfile.cpp
index dbae76717..ad98bf652 100644
--- a/src/zenutil/basicfile.cpp
+++ b/src/zenutil/basicfile.cpp
@@ -171,6 +171,8 @@ BasicFile::Read(void* Data, uint64_t BytesToRead, uint64_t FileOffset)
while (BytesToRead)
{
const uint64_t NumberOfBytesToRead = Min(BytesToRead, MaxChunkSize);
+ int32_t Error = 0;
+ size_t BytesRead = 0;
#if ZEN_PLATFORM_WINDOWS
OVERLAPPED Ovl{};
@@ -180,19 +182,37 @@ BasicFile::Read(void* Data, uint64_t BytesToRead, uint64_t FileOffset)
DWORD dwNumberOfBytesRead = 0;
BOOL Success = ::ReadFile(m_FileHandle, Data, DWORD(NumberOfBytesToRead), &dwNumberOfBytesRead, &Ovl);
-
- ZEN_ASSERT(dwNumberOfBytesRead == NumberOfBytesToRead);
+ if (Success)
+ {
+ BytesRead = size_t(dwNumberOfBytesRead);
+ }
+ else
+ {
+ Error = zen::GetLastError();
+ }
#else
static_assert(sizeof(off_t) >= sizeof(uint64_t), "sizeof(off_t) does not support large files");
- int Fd = int(uintptr_t(m_FileHandle));
- int BytesRead = pread(Fd, Data, NumberOfBytesToRead, FileOffset);
- bool Success = (BytesRead > 0);
+ int Fd = int(uintptr_t(m_FileHandle));
+ ssize_t ReadResult = pread(Fd, Data, NumberOfBytesToRead, FileOffset);
+ if (ReadResult != -1)
+ {
+ BytesRead = size_t(ReadResult);
+ }
+ else
+ {
+ Error = zen::GetLastError();
+ }
#endif
- if (!Success)
+ if (Error || (BytesRead != NumberOfBytesToRead))
{
- std::error_code Dummy;
- ThrowLastError(fmt::format("Failed to read from file '{}'", zen::PathFromHandle(m_FileHandle, Dummy)));
+ std::error_code DummyEc;
+ throw std::system_error(std::error_code(Error, std::system_category()),
+ fmt::format("ReadFile/pread failed (offset {:#x}, size {:#x}) file: '{}' (size {:#x})",
+ FileOffset,
+ NumberOfBytesToRead,
+ PathFromHandle(m_FileHandle, DummyEc),
+ FileSizeFromHandle(m_FileHandle)));
}
BytesToRead -= NumberOfBytesToRead;