14#if QT_CONFIG(sharedmemory)
15#if QT_CONFIG(sysv_shm)
24#include "private/qcore_unix_p.h"
25#if defined(Q_OS_DARWIN)
26#include "private/qcore_mac_p.h"
32using namespace QtIpcCommon;
34bool QSharedMemorySystemV::runtimeSupportCheck()
36#if defined(Q_OS_DARWIN)
40 static const bool result = []() {
41 (
void)shmget(IPC_PRIVATE, ~
size_t(0), 0);
42 return errno != ENOSYS;
48inline void QSharedMemorySystemV::updateNativeKeyFile(
const QNativeIpcKey &nativeKey)
51 if (!nativeKey.nativeKey().isEmpty())
60key_t QSharedMemorySystemV::handle(QSharedMemoryPrivate *self)
67 if (nativeKeyFile.isEmpty())
68 updateNativeKeyFile(
self->nativeKey);
69 if (nativeKeyFile.isEmpty()) {
70 self->setError(QSharedMemory::KeyError,
71 QSharedMemory::tr(
"%1: key is empty")
72 .
arg(
"QSharedMemory::handle:"_L1));
76 unix_key = ftok(nativeKeyFile,
int(
self->nativeKey.type()));
78 self->setUnixErrorString(
"QSharedMemory::handle"_L1);
79 nativeKeyFile.
clear();
85bool QSharedMemorySystemV::cleanHandle(QSharedMemoryPrivate *self)
91 struct shmid_ds shmid_ds;
94 int id = shmget(unix_key, 0, 0400);
96 if (shmctl(
id, IPC_STAT, &shmid_ds))
97 return errno != EINVAL;
100 if (shmid_ds.shm_nattch != 0)
103 if (shmctl(
id, IPC_RMID, &shmid_ds) < 0) {
104 if (errno != EINVAL) {
105 self->setUnixErrorString(
"QSharedMemory::remove"_L1);
111 return unlink(keyfile) == 0;
114bool QSharedMemorySystemV::create(QSharedMemoryPrivate *self,
qsizetype size)
117 bool createdFile =
false;
118 updateNativeKeyFile(
self->nativeKey);
119 int built = createUnixKeyFile(nativeKeyFile);
121 self->setError(QSharedMemory::KeyError,
122 QSharedMemory::tr(
"%1: unable to make key")
123 .
arg(
"QSharedMemory::handle:"_L1));
133 unlink(nativeKeyFile);
138 if (-1 == shmget(unix_key,
size_t(
size), 0600 | IPC_CREAT | IPC_EXCL)) {
139 const auto function =
"QSharedMemory::create"_L1;
142 self->setError(QSharedMemory::InvalidSize,
143 QSharedMemory::tr(
"%1: system-imposed size restrictions")
144 .
arg(
"QSharedMemory::handle"_L1));
147 self->setUnixErrorString(function);
149 if (createdFile &&
self->error != QSharedMemory::AlreadyExists)
150 unlink(nativeKeyFile);
157bool QSharedMemorySystemV::attach(QSharedMemoryPrivate *self, QSharedMemory::AccessMode
mode)
160 int id = shmget(unix_key, 0, (
mode == QSharedMemory::ReadOnly ? 0400 : 0600));
162 self->setUnixErrorString(
"QSharedMemory::attach (shmget)"_L1);
164 nativeKeyFile.
clear();
169 self->memory = shmat(
id,
nullptr, (
mode == QSharedMemory::ReadOnly ? SHM_RDONLY : 0));
171 self->memory =
nullptr;
172 self->setUnixErrorString(
"QSharedMemory::attach (shmat)"_L1);
178 if (!shmctl(
id, IPC_STAT, &shmid_ds)) {
181 self->setUnixErrorString(
"QSharedMemory::attach (shmctl)"_L1);
188bool QSharedMemorySystemV::detach(QSharedMemoryPrivate *self)
191 if (shmdt(
self->memory) < 0) {
192 const auto function =
"QSharedMemory::detach"_L1;
195 self->setError(QSharedMemory::NotFound,
196 QSharedMemory::tr(
"%1: not attached").
arg(function));
199 self->setUnixErrorString(function);
203 self->memory =
nullptr;
206 return cleanHandle(self);
static QByteArray encodeName(const QString &fileName)
Converts fileName to an 8-bit encoding that you can use in native APIs.
void clear()
Clears the contents of the string and makes it null.
qsizetype size() const noexcept
Returns the number of characters in this string.
Combined button and popup list for selecting options.
bool qt_apple_isSandboxed()
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
GLuint64 GLenum void * handle
GLenum GLuint GLintptr GLsizeiptr size
[1]