diff options
author | Lars Knoll <lars.knoll@qt.io> | 2020-03-15 12:33:35 +0100 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2020-07-07 20:38:57 +0000 |
commit | a2cef41a3199b7bdaa64c911c7a2e7d0b0daecd4 (patch) | |
tree | 45a7ff001198601fe2483dc552d3855064493d3a | |
parent | 9ad1c6d835eac2938f1e6137dd420e274dcbef6e (diff) |
Extend QSharedMemory to work with qsizetype for sizes
This allows larger than 2G memory segments to be allocated.
Fixes: QTBUG-76995
Change-Id: I95309eeea511fadb28724c7592298c2fcc6f1d1a
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
-rw-r--r-- | src/corelib/kernel/qsharedmemory.cpp | 4 | ||||
-rw-r--r-- | src/corelib/kernel/qsharedmemory.h | 4 | ||||
-rw-r--r-- | src/corelib/kernel/qsharedmemory_android.cpp | 2 | ||||
-rw-r--r-- | src/corelib/kernel/qsharedmemory_p.h | 4 | ||||
-rw-r--r-- | src/corelib/kernel/qsharedmemory_posix.cpp | 8 | ||||
-rw-r--r-- | src/corelib/kernel/qsharedmemory_systemv.cpp | 6 | ||||
-rw-r--r-- | src/corelib/kernel/qsharedmemory_win.cpp | 14 |
7 files changed, 24 insertions, 18 deletions
diff --git a/src/corelib/kernel/qsharedmemory.cpp b/src/corelib/kernel/qsharedmemory.cpp index 2d65e0bbe4..0433edff2b 100644 --- a/src/corelib/kernel/qsharedmemory.cpp +++ b/src/corelib/kernel/qsharedmemory.cpp @@ -340,7 +340,7 @@ QString QSharedMemory::nativeKey() const \sa error() */ -bool QSharedMemory::create(int size, AccessMode mode) +bool QSharedMemory::create(qsizetype size, AccessMode mode) { Q_D(QSharedMemory); @@ -384,7 +384,7 @@ bool QSharedMemory::create(int size, AccessMode mode) \sa create(), attach() */ -int QSharedMemory::size() const +qsizetype QSharedMemory::size() const { Q_D(const QSharedMemory); return d->size; diff --git a/src/corelib/kernel/qsharedmemory.h b/src/corelib/kernel/qsharedmemory.h index 6236c6aa4c..0197b18624 100644 --- a/src/corelib/kernel/qsharedmemory.h +++ b/src/corelib/kernel/qsharedmemory.h @@ -103,8 +103,8 @@ public: void setNativeKey(const QString &key); QString nativeKey() const; - bool create(int size, AccessMode mode = ReadWrite); - int size() const; + bool create(qsizetype size, AccessMode mode = ReadWrite); + qsizetype size() const; bool attach(AccessMode mode = ReadWrite); bool isAttached() const; diff --git a/src/corelib/kernel/qsharedmemory_android.cpp b/src/corelib/kernel/qsharedmemory_android.cpp index 2661e39575..7165ebcc3d 100644 --- a/src/corelib/kernel/qsharedmemory_android.cpp +++ b/src/corelib/kernel/qsharedmemory_android.cpp @@ -84,7 +84,7 @@ bool QSharedMemoryPrivate::cleanHandle() return true; } -bool QSharedMemoryPrivate::create(int size) +bool QSharedMemoryPrivate::create(qsizetype size) { Q_UNUSED(size); Q_UNIMPLEMENTED(); diff --git a/src/corelib/kernel/qsharedmemory_p.h b/src/corelib/kernel/qsharedmemory_p.h index e6e989abda..a248937037 100644 --- a/src/corelib/kernel/qsharedmemory_p.h +++ b/src/corelib/kernel/qsharedmemory_p.h @@ -123,7 +123,7 @@ public: QSharedMemoryPrivate(); void *memory; - int size; + qsizetype size; QString key; QString nativeKey; QSharedMemory::SharedMemoryError error; @@ -145,7 +145,7 @@ public: #endif bool initKey(); bool cleanHandle(); - bool create(int size); + bool create(qsizetype size); bool attach(QSharedMemory::AccessMode mode); bool detach(); diff --git a/src/corelib/kernel/qsharedmemory_posix.cpp b/src/corelib/kernel/qsharedmemory_posix.cpp index 80f9a35651..d83ff4cb92 100644 --- a/src/corelib/kernel/qsharedmemory_posix.cpp +++ b/src/corelib/kernel/qsharedmemory_posix.cpp @@ -82,7 +82,7 @@ bool QSharedMemoryPrivate::cleanHandle() return true; } -bool QSharedMemoryPrivate::create(int size) +bool QSharedMemoryPrivate::create(qsizetype size) { if (!handle()) return false; @@ -165,11 +165,11 @@ bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode mode) cleanHandle(); return false; } - size = st.st_size; + size = qsizetype(st.st_size); // grab the memory const int mprot = (mode == QSharedMemory::ReadOnly ? PROT_READ : PROT_READ | PROT_WRITE); - memory = QT_MMAP(0, size, mprot, MAP_SHARED, hand, 0); + memory = QT_MMAP(0, size_t(size), mprot, MAP_SHARED, hand, 0); if (memory == MAP_FAILED || !memory) { setErrorString(QLatin1String("QSharedMemory::attach (mmap)")); cleanHandle(); @@ -191,7 +191,7 @@ bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode mode) bool QSharedMemoryPrivate::detach() { // detach from the memory segment - if (::munmap(memory, size) == -1) { + if (::munmap(memory, size_t(size)) == -1) { setErrorString(QLatin1String("QSharedMemory::detach (munmap)")); return false; } diff --git a/src/corelib/kernel/qsharedmemory_systemv.cpp b/src/corelib/kernel/qsharedmemory_systemv.cpp index 0ba5f65641..59693951b8 100644 --- a/src/corelib/kernel/qsharedmemory_systemv.cpp +++ b/src/corelib/kernel/qsharedmemory_systemv.cpp @@ -132,7 +132,7 @@ bool QSharedMemoryPrivate::cleanHandle() return true; } -bool QSharedMemoryPrivate::create(int size) +bool QSharedMemoryPrivate::create(qsizetype size) { // build file if needed bool createdFile = false; @@ -154,7 +154,7 @@ bool QSharedMemoryPrivate::create(int size) } // create - if (-1 == shmget(unix_key, size, 0600 | IPC_CREAT | IPC_EXCL)) { + if (-1 == shmget(unix_key, size_t(size), 0600 | IPC_CREAT | IPC_EXCL)) { const QLatin1String function("QSharedMemory::create"); switch (errno) { case EINVAL: @@ -192,7 +192,7 @@ bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode mode) // grab the size shmid_ds shmid_ds; if (!shmctl(id, IPC_STAT, &shmid_ds)) { - size = (int)shmid_ds.shm_segsz; + size = (qsizetype)shmid_ds.shm_segsz; } else { setErrorString(QLatin1String("QSharedMemory::attach (shmctl)")); return false; diff --git a/src/corelib/kernel/qsharedmemory_win.cpp b/src/corelib/kernel/qsharedmemory_win.cpp index cbf31bcb2f..549fc13b2d 100644 --- a/src/corelib/kernel/qsharedmemory_win.cpp +++ b/src/corelib/kernel/qsharedmemory_win.cpp @@ -122,7 +122,7 @@ bool QSharedMemoryPrivate::cleanHandle() return true; } -bool QSharedMemoryPrivate::create(int size) +bool QSharedMemoryPrivate::create(qsizetype size) { const QLatin1String function("QSharedMemory::create"); if (nativeKey.isEmpty()) { @@ -132,8 +132,14 @@ bool QSharedMemoryPrivate::create(int size) } // Create the file mapping. - hand = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, size, - reinterpret_cast<const wchar_t*>(nativeKey.utf16())); + DWORD high, low; + if constexpr (sizeof(qsizetype) == 8) + high = DWORD(quint64(size) >> 32); + else + high = 0; + low = DWORD(size_t(size) & 0xffffffff); + hand = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, high, low, + reinterpret_cast<const wchar_t *>(nativeKey.utf16())); setErrorString(function); // hand is valid when it already exists unlike unix so explicitly check @@ -160,7 +166,7 @@ bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode mode) errorString = QSharedMemory::tr("%1: size query failed").arg(QLatin1String("QSharedMemory::attach: ")); return false; } - size = info.RegionSize; + size = qsizetype(info.RegionSize); return true; } |