aboutsummaryrefslogtreecommitdiff
path: root/zencore/iobuffer.cpp
diff options
context:
space:
mode:
authorMartin Ridgers <[email protected]>2021-09-16 13:52:56 +0200
committerMartin Ridgers <[email protected]>2021-09-16 14:20:52 +0200
commit42bac2857db915f27095588e7b0a78cd54571ebe (patch)
tree37d84c08a1c5dbf60e5749d0ff1471cf2447cce7 /zencore/iobuffer.cpp
parentFixed up platform-specific includes (diff)
downloadzen-42bac2857db915f27095588e7b0a78cd54571ebe.tar.xz
zen-42bac2857db915f27095588e7b0a78cd54571ebe.zip
Implementation of IoBufferExtendedCore() using mmap()
Diffstat (limited to 'zencore/iobuffer.cpp')
-rw-r--r--zencore/iobuffer.cpp42
1 files changed, 36 insertions, 6 deletions
diff --git a/zencore/iobuffer.cpp b/zencore/iobuffer.cpp
index 4a74b9a60..2473e0530 100644
--- a/zencore/iobuffer.cpp
+++ b/zencore/iobuffer.cpp
@@ -12,7 +12,12 @@
#include <zencore/thread.h>
#include <system_error>
-#include <atlfile.h>
+#if ZEN_PLATFORM_WINDOWS
+# include <atlfile.h>
+#else
+# include <sys/mman.h>
+#endif
+
#include <gsl/gsl-lite.hpp>
namespace zen {
@@ -156,17 +161,29 @@ IoBufferExtendedCore::~IoBufferExtendedCore()
{
if (m_MappedPointer)
{
+#if ZEN_PLATFORM_WINDOWS
UnmapViewOfFile(m_MappedPointer);
+#else
+ uint64_t MapSize = ~uint64_t(uintptr_t(m_MmapHandle));
+ munmap(m_MappedPointer, MapSize);
+#endif
}
+#if ZEN_PLATFORM_WINDOWS
if (m_Flags & kOwnsMmap)
{
CloseHandle(m_MmapHandle);
}
+#endif
if (m_Flags & kOwnsFile)
{
+#if ZEN_PLATFORM_WINDOWS
BOOL Success = CloseHandle(m_FileHandle);
+#else
+ int Fd = int(uintptr_t(m_FileHandle));
+ bool Success = (close(Fd) == 0);
+#endif
if (!Success)
{
@@ -196,6 +213,11 @@ IoBufferExtendedCore::Materialize() const
if (m_MmapHandle)
return;
+ const uint64_t MapOffset = m_FileOffset & ~0xffffull;
+ const uint64_t MappedOffsetDisplacement = m_FileOffset - MapOffset;
+ const uint64_t MapSize = m_DataBytes + MappedOffsetDisplacement;
+
+#if ZEN_PLATFORM_WINDOWS
m_MmapHandle = CreateFileMapping(m_FileHandle,
/* lpFileMappingAttributes */ nullptr,
/* flProtect */ PAGE_READONLY,
@@ -211,20 +233,28 @@ IoBufferExtendedCore::Materialize() const
m_Flags |= kOwnsMmap;
- const uint64_t MapOffset = m_FileOffset & ~0xffffull;
- const uint64_t MappedOffsetDisplacement = m_FileOffset - MapOffset;
- const uint64_t MapSize = m_DataBytes + MappedOffsetDisplacement;
-
void* MappedBase = MapViewOfFile(m_MmapHandle,
/* dwDesiredAccess */ FILE_MAP_READ,
/* FileOffsetHigh */ uint32_t(MapOffset >> 32),
/* FileOffsetLow */ uint32_t(MapOffset & 0xffFFffFFu),
/* dwNumberOfBytesToMap */ MapSize);
+#else
+ m_MmapHandle = (void*)uintptr_t(~MapSize); // ~ so it's never null (assuming MapSize >= 0)
+ m_Flags |= kOwnsMmap;
+
+ void* MappedBase = mmap(
+ /* addr */ nullptr,
+ /* length */ MapSize,
+ /* prot */ PROT_READ,
+ /* flags */ MAP_SHARED|MAP_NORESERVE,
+ /* fd */ int(uintptr_t(m_FileHandle)),
+ /* offset */ MapOffset);
+#endif // ZEN_PLATFORM_WINDOWS
if (MappedBase == nullptr)
{
throw std::system_error(
- std::error_code(::GetLastError(), std::system_category()),
+ std::error_code(zen::GetLastError(), std::system_category()),
"MapViewOfFile failed (offset {:#x}, size {:#x}) file: '{}'"_format(MapOffset, MapSize, zen::PathFromHandle(m_FileHandle)));
}