13#if QT_CONFIG(sharedmemory)
14#if QT_CONFIG(posix_shm)
21#include "private/qcore_unix_p.h"
30using namespace QtIpcCommon;
32bool QSharedMemoryPosix::runtimeSupportCheck()
34 static const bool result = []() {
35 (
void)shm_open(
"", 0, 0);
36 return errno != ENOSYS;
41bool QSharedMemoryPosix::handle(QSharedMemoryPrivate *self)
45 self->setError(QSharedMemory::KeyError,
46 QSharedMemory::tr(
"%1: key is empty").
arg(
"QSharedMemory::handle"_L1));
53bool QSharedMemoryPosix::cleanHandle(QSharedMemoryPrivate *)
62bool QSharedMemoryPosix::create(QSharedMemoryPrivate *self,
qsizetype size)
70 QT_EINTR_LOOP(
fd, ::shm_open(shmName.constData(), O_RDWR | O_CREAT | O_EXCL | O_CLOEXEC, 0600));
72 const int errorNumber = errno;
73 const auto function =
"QSharedMemory::attach (shm_open)"_L1;
74 switch (errorNumber) {
76 self->setError(QSharedMemory::KeyError,
77 QSharedMemory::tr(
"%1: bad name").
arg(function));
80 self->setUnixErrorString(function);
89 self->setUnixErrorString(
"QSharedMemory::create (ftruncate)"_L1);
99bool QSharedMemoryPosix::attach(QSharedMemoryPrivate *self, QSharedMemory::AccessMode
mode)
103 const int oflag = (
mode == QSharedMemory::ReadOnly ? O_RDONLY : O_RDWR);
104 const mode_t omode = (
mode == QSharedMemory::ReadOnly ? 0400 : 0600);
106 QT_EINTR_LOOP(hand, ::shm_open(shmName.constData(), oflag | O_CLOEXEC, omode));
108 const int errorNumber = errno;
109 const auto function =
"QSharedMemory::attach (shm_open)"_L1;
110 switch (errorNumber) {
112 self->setError(QSharedMemory::KeyError,
113 QSharedMemory::tr(
"%1: bad name").
arg(function));
116 self->setUnixErrorString(function);
124 if (QT_FSTAT(hand, &st) == -1) {
125 self->setUnixErrorString(
"QSharedMemory::attach (fstat)"_L1);
132 const int mprot = (
mode == QSharedMemory::ReadOnly ? PROT_READ : PROT_READ | PROT_WRITE);
133 self->memory = QT_MMAP(0,
size_t(
self->
size), mprot, MAP_SHARED, hand, 0);
135 self->setUnixErrorString(
"QSharedMemory::attach (mmap)"_L1);
146 fcntl(hand, F_ADD_SEALS, F_SEAL_SHRINK);
152bool QSharedMemoryPosix::detach(QSharedMemoryPrivate *self)
156 self->setUnixErrorString(
"QSharedMemory::detach (munmap)"_L1);
171 if (QT_FSTAT(hand, &st) == 0) {
173 shm_nattch = st.st_nlink - 2;
179 if (shm_nattch == 0) {
181 if (::shm_unlink(shmName.constData()) == -1 && errno != ENOENT)
182 self->setUnixErrorString(
"QSharedMemory::detach (shm_unlink)"_L1);
static QByteArray encodeName(const QString &fileName)
Converts fileName to an 8-bit encoding that you can use in native APIs.
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
qsizetype size() const noexcept
Returns the number of characters in this string.
Combined button and popup list for selecting options.
#define QT_EINTR_LOOP(var, cmd)
static int qt_safe_close(int fd)
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
GLuint64 GLenum void * handle
GLenum GLuint GLintptr GLsizeiptr size
[1]