aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/zencore/iobuffer.cpp45
1 files changed, 37 insertions, 8 deletions
diff --git a/src/zencore/iobuffer.cpp b/src/zencore/iobuffer.cpp
index e28bf11b2..96653c670 100644
--- a/src/zencore/iobuffer.cpp
+++ b/src/zencore/iobuffer.cpp
@@ -283,6 +283,8 @@ IoBufferExtendedCore::Materialize() const
{
AllocateBuffer(m_DataBytes, sizeof(void*));
NewFlags |= kIsOwnedByThis;
+ int32_t Error = 0;
+ size_t BytesRead = 0;
#if ZEN_PLATFORM_WINDOWS
OVERLAPPED Ovl{};
@@ -291,16 +293,43 @@ IoBufferExtendedCore::Materialize() const
Ovl.OffsetHigh = DWORD(m_FileOffset >> 32);
DWORD dwNumberOfBytesRead = 0;
- BOOL Success = ::ReadFile(m_FileHandle, (void*)m_DataPtr, DWORD(m_DataBytes), &dwNumberOfBytesRead, &Ovl);
-
- ZEN_ASSERT(Success);
- ZEN_ASSERT(dwNumberOfBytesRead == m_DataBytes);
+ BOOL Success = ::ReadFile(m_FileHandle, (void*)m_DataPtr, DWORD(m_DataBytes), &dwNumberOfBytesRead, &Ovl) == TRUE;
+ 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, (void*)m_DataPtr, m_DataBytes, m_FileOffset);
- bool Success = (BytesRead > 0);
+ int Fd = int(uintptr_t(m_FileHandle));
+ int ReadResult = pread(Fd, (void*)m_DataPtr, m_DataBytes, m_FileOffset);
+ if (ReadResult != -1)
+ {
+ BytesRead = size_t(ReadResult);
+ }
+ else
+ {
+ Error = zen::GetLastError();
+ }
#endif // ZEN_PLATFORM_WINDOWS
+ if (Error || (BytesRead != m_DataBytes))
+ {
+ ZEN_ERROR("ReadFile/pread failed (offset {:#x}, size {:#x}) file: '{}' (size {:#x}), {}",
+ m_FileOffset,
+ m_DataBytes,
+ zen::PathFromHandle(m_FileHandle),
+ zen::FileSizeFromHandle(m_FileHandle),
+ GetSystemErrorAsString(Error));
+ throw std::system_error(std::error_code(Error, std::system_category()),
+ fmt::format("ReadFile/pread failed (offset {:#x}, size {:#x}) file: '{}' (size {:#x})",
+ m_FileOffset,
+ m_DataBytes,
+ PathFromHandle(m_FileHandle),
+ FileSizeFromHandle(m_FileHandle)));
+ }
m_Flags.fetch_or(NewFlags, std::memory_order_release);
return;
@@ -357,7 +386,7 @@ IoBufferExtendedCore::Materialize() const
CloseHandle(NewMmapHandle);
#endif // ZEN_PLATFORM_WINDOWS
- ZEN_ERROR("MapViewOfFile failed (offset {:#x}, size {:#x}) file: '{}' (size {:#x}), {}",
+ ZEN_ERROR("MapViewOfFile/mmap failed (offset {:#x}, size {:#x}) file: '{}' (size {:#x}), {}",
MapOffset,
MapSize,
zen::PathFromHandle(m_FileHandle),