summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2020-03-15 12:33:35 +0100
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2020-07-07 20:38:57 +0000
commita2cef41a3199b7bdaa64c911c7a2e7d0b0daecd4 (patch)
tree45a7ff001198601fe2483dc552d3855064493d3a
parent9ad1c6d835eac2938f1e6137dd420e274dcbef6e (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.cpp4
-rw-r--r--src/corelib/kernel/qsharedmemory.h4
-rw-r--r--src/corelib/kernel/qsharedmemory_android.cpp2
-rw-r--r--src/corelib/kernel/qsharedmemory_p.h4
-rw-r--r--src/corelib/kernel/qsharedmemory_posix.cpp8
-rw-r--r--src/corelib/kernel/qsharedmemory_systemv.cpp6
-rw-r--r--src/corelib/kernel/qsharedmemory_win.cpp14
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;
}