14#if QT_CONFIG(sysv_shm)
23#include "private/qcore_unix_p.h"
24#if defined(Q_OS_DARWIN)
25#include "private/qcore_mac_p.h"
31using namespace QtIpcCommon;
33bool QSharedMemorySystemV::runtimeSupportCheck()
35#if defined(Q_OS_DARWIN)
39 static const bool result = []() {
40 (
void)shmget(IPC_PRIVATE, ~
size_t(0), 0);
41 return errno != ENOSYS;
47inline void QSharedMemorySystemV::updateNativeKeyFile(
const QNativeIpcKey &nativeKey)
50 if (!nativeKey.nativeKey().isEmpty())
59key_t QSharedMemorySystemV::handle(QSharedMemoryPrivate *self)
66 if (nativeKeyFile.isEmpty())
67 updateNativeKeyFile(
self->nativeKey);
68 if (nativeKeyFile.isEmpty()) {
69 self->setError(QSharedMemory::KeyError,
70 QSharedMemory::tr(
"%1: key is empty")
71 .
arg(
"QSharedMemory::handle:"_L1));
75 unix_key = ftok(nativeKeyFile,
int(
self->nativeKey.type()));
77 self->setUnixErrorString(
"QSharedMemory::handle"_L1);
83bool QSharedMemorySystemV::cleanHandle(QSharedMemoryPrivate *self)
89 struct shmid_ds shmid_ds;
92 int id = shmget(unix_key, 0, 0400);
94 if (shmctl(
id, IPC_STAT, &shmid_ds))
95 return errno != EINVAL;
98 if (shmid_ds.shm_nattch != 0)
101 if (shmctl(
id, IPC_RMID, &shmid_ds) < 0) {
102 if (errno != EINVAL) {
103 self->setUnixErrorString(
"QSharedMemory::remove"_L1);
109 return unlink(keyfile) == 0;
112bool QSharedMemorySystemV::create(QSharedMemoryPrivate *self,
qsizetype size)
115 bool createdFile =
false;
116 updateNativeKeyFile(
self->nativeKey);
117 int built = createUnixKeyFile(nativeKeyFile);
119 self->setError(QSharedMemory::KeyError,
120 QSharedMemory::tr(
"%1: unable to make key")
121 .
arg(
"QSharedMemory::handle:"_L1));
131 unlink(nativeKeyFile);
136 if (-1 == shmget(unix_key,
size_t(
size), 0600 | IPC_CREAT | IPC_EXCL)) {
137 const auto function =
"QSharedMemory::create"_L1;
140 self->setError(QSharedMemory::InvalidSize,
141 QSharedMemory::tr(
"%1: system-imposed size restrictions")
142 .
arg(
"QSharedMemory::handle"_L1));
145 self->setUnixErrorString(function);
147 if (createdFile &&
self->error != QSharedMemory::AlreadyExists)
148 unlink(nativeKeyFile);
155bool QSharedMemorySystemV::attach(QSharedMemoryPrivate *self, QSharedMemory::AccessMode
mode)
158 int id = shmget(unix_key, 0, (
mode == QSharedMemory::ReadOnly ? 0400 : 0600));
160 self->setUnixErrorString(
"QSharedMemory::attach (shmget)"_L1);
165 self->memory = shmat(
id,
nullptr, (
mode == QSharedMemory::ReadOnly ? SHM_RDONLY : 0));
167 self->memory =
nullptr;
168 self->setUnixErrorString(
"QSharedMemory::attach (shmat)"_L1);
174 if (!shmctl(
id, IPC_STAT, &shmid_ds)) {
177 self->setUnixErrorString(
"QSharedMemory::attach (shmctl)"_L1);
184bool QSharedMemorySystemV::detach(QSharedMemoryPrivate *self)
187 if (shmdt(
self->memory) < 0) {
188 const auto function =
"QSharedMemory::detach"_L1;
191 self->setError(QSharedMemory::NotFound,
192 QSharedMemory::tr(
"%1: not attached").
arg(function));
195 self->setUnixErrorString(function);
199 self->memory =
nullptr;
202 return cleanHandle(self);
static QByteArray encodeName(const QString &fileName)
Converts fileName to an 8-bit encoding that you can use in native APIs.
qsizetype size() const
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
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction function
GLuint64 GLenum void * handle
GLenum GLuint GLintptr GLsizeiptr size
[1]