13#if QT_CONFIG(posix_shm)
20#include "private/qcore_unix_p.h"
29using namespace QtIpcCommon;
31bool QSharedMemoryPosix::runtimeSupportCheck()
33 static const bool result = []() {
34 (
void)shm_open(
"", 0, 0);
35 return errno != ENOSYS;
40bool QSharedMemoryPosix::handle(QSharedMemoryPrivate *self)
44 self->setError(QSharedMemory::KeyError,
45 QSharedMemory::tr(
"%1: key is empty").
arg(
"QSharedMemory::handle"_L1));
52bool QSharedMemoryPosix::cleanHandle(QSharedMemoryPrivate *)
61bool QSharedMemoryPosix::create(QSharedMemoryPrivate *self,
qsizetype size)
71 const int errorNumber = errno;
72 const auto function =
"QSharedMemory::attach (shm_open)"_L1;
73 switch (errorNumber) {
75 self->setError(QSharedMemory::KeyError,
76 QSharedMemory::tr(
"%1: bad name").
arg(function));
79 self->setUnixErrorString(function);
88 self->setUnixErrorString(
"QSharedMemory::create (ftruncate)"_L1);
98bool QSharedMemoryPosix::attach(QSharedMemoryPrivate *self, QSharedMemory::AccessMode
mode)
102 const int oflag = (
mode == QSharedMemory::ReadOnly ? O_RDONLY : O_RDWR);
103 const mode_t omode = (
mode == QSharedMemory::ReadOnly ? 0400 : 0600);
107 const int errorNumber = errno;
108 const auto function =
"QSharedMemory::attach (shm_open)"_L1;
109 switch (errorNumber) {
111 self->setError(QSharedMemory::KeyError,
112 QSharedMemory::tr(
"%1: bad name").
arg(function));
115 self->setUnixErrorString(function);
123 if (QT_FSTAT(hand, &st) == -1) {
124 self->setUnixErrorString(
"QSharedMemory::attach (fstat)"_L1);
131 const int mprot = (
mode == QSharedMemory::ReadOnly ? PROT_READ : PROT_READ | PROT_WRITE);
132 self->memory = QT_MMAP(0,
size_t(
self->
size), mprot, MAP_SHARED, hand, 0);
134 self->setUnixErrorString(
"QSharedMemory::attach (mmap)"_L1);
145 fcntl(hand, F_ADD_SEALS, F_SEAL_SHRINK);
151bool QSharedMemoryPosix::detach(QSharedMemoryPrivate *self)
155 self->setUnixErrorString(
"QSharedMemory::detach (munmap)"_L1);
170 if (QT_FSTAT(hand, &st) == 0) {
172 shm_nattch = st.st_nlink - 2;
178 if (shm_nattch == 0) {
180 if (::shm_unlink(shmName.
constData()) == -1 && errno != ENOENT)
181 self->setUnixErrorString(
"QSharedMemory::detach (shm_unlink)"_L1);
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
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.
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
Combined button and popup list for selecting options.
#define 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
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction function
GLuint64 GLenum void * handle
GLenum GLuint GLintptr GLsizeiptr size
[1]