QResource: add support for memory mapping on Windows

Change-Id: I6979d02a7395405cbf23fffd17c90b446cba1486
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
bb10
Thiago Macieira 2024-04-23 16:05:21 -07:00
parent 315d6b6c2e
commit 08bb11d101
1 changed files with 16 additions and 0 deletions

View File

@ -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);
}