summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2024-04-23 16:05:21 -0700
committerThiago Macieira <thiago.macieira@intel.com>2024-05-02 17:12:35 -0700
commit08bb11d101636693e6021530731443c9eec2ca9c (patch)
treeba2ce0d2c17e31dc87c1cad33d69c3667920380a
parent315d6b6c2e7f2a843c57c6835f1dc37e549ff647 (diff)
QResource: add support for memory mapping on Windows
Change-Id: I6979d02a7395405cbf23fffd17c90b446cba1486 Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
-rw-r--r--src/corelib/io/qresource.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/corelib/io/qresource.cpp b/src/corelib/io/qresource.cpp
index e40e7aeb0e..df57d12efc 100644
--- a/src/corelib/io/qresource.cpp
+++ b/src/corelib/io/qresource.cpp
@@ -37,6 +37,9 @@
# define QT_USE_MMAP
# include <sys/mman.h>
#endif
+#ifdef Q_OS_WIN
+# include <qt_windows.h>
+#endif
//#define DEBUG_RESOURCE_MATCH
@@ -1147,6 +1150,9 @@ void QDynamicFileResourceRoot::unmap_sys(void *base, qsizetype size)
{
#if defined(QT_USE_MMAP)
munmap(base, size);
+#elif defined(Q_OS_WIN)
+ Q_UNUSED(size)
+ UnmapViewOfFile(reinterpret_cast<void *>(base));
#endif
}
@@ -1166,6 +1172,16 @@ uchar *QDynamicFileResourceRoot::map_sys(QFile &file, qint64 offset, qsizetype s
ptr = QT_MMAP(nullptr, size, protection, flags, fd, offset);
if (ptr == MAP_FAILED)
ptr = nullptr;
+#elif defined(Q_OS_WIN)
+ int fd = file.handle();
+ HANDLE fileHandle = reinterpret_cast<HANDLE>(_get_osfhandle(fd));
+ if (fileHandle != INVALID_HANDLE_VALUE) {
+ HANDLE mapHandle = CreateFileMapping(fileHandle, 0, PAGE_WRITECOPY, 0, 0, 0);
+ if (mapHandle) {
+ ptr = MapViewOfFile(mapHandle, FILE_MAP_COPY, DWORD(offset >> 32), DWORD(offset), size);
+ CloseHandle(mapHandle);
+ }
+ }
#endif // QT_USE_MMAP
return static_cast<uchar *>(ptr);
}